標籤:os strong 資料 問題 re c
基於TCP的socket編程的伺服器程式流程如下:
1.建立通訊端
SOCKETsockSrv = socket(AF_INET, SOCK_STREAM, 0) ;
2.將通訊端綁定到本地地址和連接埠上
SOCKADDR_INaddrSrv ;
addrSrv.sin_addr.S_un.S_addr =htonl(INADDR_ANY) ; //把一個u_long類型的值轉化為網路位元組順序
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(6000) ;
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) ; //綁定建立了的通訊端
3.將建立的通訊端設為監聽模式,等待接收用戶端的請求
listen(sockSrv,5) ;
4.等待客戶請求的到來,當請求到來後,接收串連請求,返回一個新的對於與此次串連的通訊端
SOCKETsockConn = accept(sockSrv, (SOCKADDR *)&addrClient, &len) ;
5.用返回的通訊端和用戶端進行通訊
send(sockConn,szSendBuf, lstrlen(szSendBuf) + 1, 0) ;
recv(sockConn, szRecvBuf, 100, 0) ;
6.返回,等待另一個客戶的請求
closesocket(sockConn) ;
7.關閉通訊端
基於TCP的socket編程的用戶端程式流程如下:
1.建立通訊端
SOCKETsockClient = socket(AF_INET, SOCK_STREAM, 0) ;
2.向伺服器發出串連請求
SOCKADDR_INaddrSrv ;
addrSrv.sin_addr.S_un.S_addr =inet_addr("192.168.0.1") ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(6000) ;
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) ;
3.和伺服器進行通訊
recv(sockClient,szRecvBuf, 100, 0) ;
send(...)
4.關閉通訊端
基於UDP的socket編程的接收端序流程如下:
1.建立通訊端
SOCKETsockSrv = socket(AF_INET, SOCK_DGRAM, 0) ;
2.將通訊端綁定到本地地址和連接埠上
SOCKADDR_INaddrSrv ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(6000) ;
addrSrv.sin_addr.S_un.S_addr =htonl(INADDR_ANY) ;
bind(sockSrv, (SOCKADDR *)&addrSrv,sizeof(SOCKADDR)) ;
3.等待接收資料
SOCKADDR_INaddrClient ;
int len = sizeof(SOCKADDR) ;
TCHAR szRecvBuf[100] ;
recvfrom(sockSrv, szRecvBuf,lstrlen(szRecvBuf) + 1, 0, (SOCKADDR *)&addrClient,&len) ;
4.關閉通訊端
基於UDP的socket編程的用戶端序流程如下:
1.建立通訊端
SOCKETsockClient = socket(AF_INET, SOCK_DGRAM, 0) ;
2.向伺服器發送資料
SOCKADDR_INaddrSrv ;
addrSrv.sin_addr.S_un.S_addr =inet_addr("192.168.0.1") ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(6000) ;
sendto(sockClient,TEXT("Hello"), lstrlen(TEXT("Hello")) + 1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) ;
3.關閉通訊端
關於recv、send發送位元組數問題:
send((sockConn,szFileBuffer, nLength, 0)函數會發送nLenth個位元組,如果nLength大於szFileBuffer的大小,那麼多餘的位元組以\0補充。如果小於szFileBuffer的大小,則會發送szFileBuffer字串截取nLength個位元組。
recv((sockConn,szFileBuffer, nLength, 0)函數原則與上面的一樣,只是當nLength大於szFileBuffer的長度時,不會以\0來填充。
同時send,recv函數遇到\0會同樣發送和接收。