c++之socket,阻塞模式


這里描述下socket的阻塞模式:

首先,socket有幾個函數

socket()  創建socket

bind()  綁定socket到一個地址

listen()  開啟soket監聽

accept()   接受別人來連接我,這個是個阻塞函數,一般服務器調用。

recv()  接受對方發過來的消息,這個也是阻塞函數,因為TCP要等對方把消息傳遞完整后再執行把消息從buff里面copy過來。這個客戶端和服務器都要調用,注意~!!!!!

send()   發送消息

connect()  連接socket,一般是客戶端。

 

上面accept和recv都是阻塞函數,要注意!!!

 

舉例:

1、server開啟后,會阻塞在accetp函數,等待別人連接。

2、client 1 開啟connect ,然后立即返回,繼續執行客戶端的代碼。此刻,server收到請求,繼續執行server代碼,一般連接成功后寫recv函數,所以server阻塞在recv。

3、client 

time  client 1        client 2           server

1                             accept,阻塞

2    connect后立即返回 

3                             收到client 1的con

4                              執行recv,阻塞

5                                          connect

6                             (收到client 2的連接,但是程序阻塞,所以排入隊列)

7                send("c2")

8                             (收到client 2的數據,但是程序阻塞,所以排入隊列)

9                                            recv(),阻塞

10      send("c1"), 並recv()阻塞

11                            收到client 1的數據c1,並send("hello c1 , im server")

12  收到數據("hello c1 , im server")通信完成

13                            server執行完11步驟后,立即查看隊列還有一個沒處理,所以處理c2的連接,收到數據"c2",發送(“"hello c2 , im server"”)

 

14                                           收到數據(“"hello c2 , im server"”)通信完成

15                              accept()阻塞

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM