1. 程式人生 > >tcp/udp建立連線並通訊的過程

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會同樣傳送和接收。