tcp/udp建立連線並通訊的過程
基於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會同樣傳送和接收。