關於socket阻塞與非阻塞情況下的recv、send、read、write返回值
阿新 • • 發佈:2019-02-15
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)的情況下認為連線是正常的, 繼續傳送。
只是阻塞模式下send會阻塞著傳送資料,非阻塞模式下如果暫時無法傳送資料會返回,不會阻塞著 send,因此需要迴圈傳送。