天天看點

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

recv:

阻塞與非阻塞recv傳回值沒有區分,都是 <0:出錯,=0:連接配接關閉,>0接收到資料大小,

特别:非阻塞模式下傳回 值 <0時并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情況 下認為連接配接是正常的,繼續接收。

隻是阻塞模式下recv會阻塞着接收資料,非阻塞模式下如果沒有資料會傳回,不會阻塞着讀,是以需要 循環讀取。

write:

阻塞與非阻塞write傳回值沒有區分,都是 <0:出錯,=0:連接配接關閉,>0發送資料大小,

特别:非阻塞模式下傳回值 <0時并且 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情況下認為連接配接是正常的, 繼續發送。

隻是阻塞模式下write會阻塞着發送資料,非阻塞模式下如果暫時無法發送資料會傳回,不會阻塞着 write,是以需要循環發送。

read:

阻塞與非阻塞read傳回值沒有區分,都是 <0:出錯,=0:連接配接關閉,>0接收到資料大小,

特别:非阻塞模式下傳回 值 <0時并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情況 下認為連接配接是正常的,繼續接收。

隻是阻塞模式下read會阻塞着接收資料,非阻塞模式下如果沒有資料會傳回,不會阻塞着讀,是以需要 循環讀取。

send:

阻塞與非阻塞send傳回值沒有區分,都是 <0:出錯,=0:連接配接關閉,>0發送資料大小,

特别:非阻塞模式下傳回值 <0時并且 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情況下認為連接配接是正常的, 繼續發送。