Linux下socket阻塞模式與非阻塞模式

2021-06-04 02:56:27 字數 1217 閱讀 6397

1、阻塞模式與非阻塞模式下recv的返回值各代表什麼意思?有沒有區別?(就我目前了解阻塞與非阻塞recv返回值沒有區分,都是<0:出錯,=0:連線關閉,>0接收到資料大小,特別:返回值<0時並且(errno == eintr || errno == ewouldblock || errno == eagain)的情況下認為連線是正常的,繼續接收。只是阻塞模式下recv會阻塞著接收資料,非阻塞模式下如果沒有資料會返回,不會阻塞著讀,因此需要迴圈讀取)。

2、阻塞模式與非阻塞模式下write的返回值各代表什麼意思?有沒有區別?(就我目前了解阻塞與非阻塞write返回值沒有區分,都是<0:出錯,=0:連線關閉,>0傳送資料大小,特別:返回值<0時並且(errno == eintr || errno == ewouldblock || errno == eagain)的情況下認為連線是正常的,繼續傳送。只是阻塞模式下write會阻塞著傳送資料,非阻塞模式下如果暫時無法傳送資料會返回,不會阻塞著write,因此需要迴圈傳送)。

3、阻塞模式下read返回值 < 0 && errno != eintr && errno != ewouldblock && errno != eagain時,連線異常,需要關閉,read返回值 < 0 && (errno == eintr || errno == ewouldblock || errno == eagain)時表示沒有資料,需要繼續接收,如果返回值大於0表示接送到資料。

非阻塞模式下read返回值 < 0表示沒有資料,= 0表示連線斷開,> 0表示接收到資料。

這2種模式下的返回值是不是這麼理解,有沒有跟詳細的理解或跟準確的說明?

4、阻塞模式與非阻塞模式下是否send返回值< 0 && (errno == eintr || errno == ewouldblock || errno == eagain)表示暫時傳送失敗,需要重試,如果send返回值<= 0, && errno != eintr && errno != ewouldblock && errno != eagain時,連線異常,需要關閉,如果send返回值 > 0則表示傳送了資料?send的返回值是否這麼理解,阻塞模式與非阻塞模式下send返回值=0是否都是傳送失敗,還是那個模式下表示暫時不可傳送,需要重發?

5、很多人說阻塞模式下read會阻塞著讀,是否這樣?我和同事試了不會阻塞read。

6、網路上找了很多資料,說的都很籠統,就分大於0,小於0,等於0,並沒有區分阻塞與非阻塞,更沒有區分乙個錯誤號,希望哪位高手能按上面的問題逐條回答一下,越詳細越好,平時少上csdn,分少,見諒。

Linux下非阻塞Socket傳送錯誤返回

專案中使用原有的網路傳送 進行資料傳輸,發現總是發不過去,或者發過去一部分,非常納悶。經過仔細排查,是socket的send函式呼叫結果處理不正確造成的。原有 int senddata char data,int length outputdebugstring send data error r ...

轉阻塞socket和非阻塞socket

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

socket阻塞與非阻塞

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