這里描述下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()阻塞