socket阻塞態 非阻塞態理解

2021-10-07 05:17:26 字數 1037 閱讀 9100

send函式

如果可用空間大小小於要傳送的資料長度,則send會被阻塞,直到緩衝區中的資料被傳送到目標主機,有了足夠的空間之後,send函式才會將資料寫入輸出緩衝區。

要寫入的資料大於輸出緩衝區的最大長度的時候,要分多次寫入,直到所有資料都被寫到緩衝區之後,send函式才會返回。

recv函式

函式先檢查輸入緩衝區,如果輸入緩衝區中有資料,讀取出緩衝區中的資料,否則的話,recv函式會被阻塞,等待網路上傳來資料。如果每次讀取的資料長度小於buffer的資料長度,沒法一次性將所有資料讀出來,需要多次執行recv函式,才能將資料讀取完畢。

send函式

如果事件正常發生,則跟阻塞態一樣,如果出現錯誤情況,如,可用空間大小小於要傳送的資料長度,則不會被阻塞,而是直接返回,通過錯誤**來檢視錯誤原因。

recv函式

即使緩衝區中無資料,也不會阻塞,而是直接返回。

socket預設是阻塞的,即recv或者send或者accept函式在沒有事件發生時,都是阻塞的。

阻塞的socket使用起來簡單,不用判斷eagain(ewouldblock)或者eintr錯誤,並且對於recv函式,在輸入緩衝區沒有資料讀或

者緩衝區資料少於要取的buff長度時,會阻塞;對於send函式,在傳送緩衝區剩餘空間小於傳送的buff長度時,會阻塞;

阻塞的時候,執行緒處於sleep休眠狀態,此時不占用cpu,cpu就可以排程別的執行緒或程序,這是阻塞態socket的優點;

socket也可以使用fcntl函式修改屬性為非阻塞的.阻塞態socket的優點對應的就是非阻塞socket的缺點,即如果所有裝置都一直沒有資料到達,呼叫者需要反覆查詢做無用功,如果阻塞在那裡作業系統可以排程別的程序執行,就不會做無用功了。select 函式可以阻塞地同時監視多個裝置(即select的timeout引數設定為null),還可以設定阻塞等待的超時時間(timeout引數設定為乙個正數,比如3s,3s內沒有事件發生,則執行緒也是sleep了3s),從而圓滿地解決了這個問題。

阻塞 非阻塞socket的理解

b 阻塞socket是這樣的 b recv socket1,buf,length 去網絡卡緩衝區讀取socket1的資料,讀到的資料儲存到buf 如果網絡卡緩衝區有1個位元組,就返回1個,有兩個就返回兩個,當然不能超過length 如果網絡卡緩衝區沒有資料,那麼就一直等待,直到有資料可讀 是的,很傻...

socket阻塞與非阻塞

何為阻塞?在以上過程中若連線還沒到來,那麼接受阻塞,程式執行到這裡不得不掛起,cpu轉而執行其他執行緒。在以上過程中若資料還沒準備好,請閱讀會一樣也會阻塞。阻塞式網路io的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些cpu時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...

轉阻塞socket和非阻塞socket

讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...