tcp/udp建立串連並通訊的過程

來源:互聯網
上載者:User

標籤: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會同樣發送和接收。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.