關於socket阻塞與非阻塞情況下的recv、send、read、write返回值

轉自:http://www.cnblogs.com/lijunjie/articles/1759688.html

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,分少,見諒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章