我使用SO_RCVTIMEO
为套接字设置超时为10秒。此问题特定于流套接字(TCP)。当我从手册页中收集recv(...)
时,这就是我所期待的:
errno
EAGAIN
或EWOULDBLOCK
。errno
设置正确。这是正确的行为吗?我只是想确保我正确理解文档。
谢谢! 布雷特
答案 0 :(得分:6)
ETIMEOUT
将被退回。如果没有数据立即可用,则会在非阻塞套接字上返回EAGAIN
或EWOULDBLOCK
。)http://pubs.opengroup.org/onlinepubs/9699919799/functions/recv.html
EAGAIN
或EWOULDBLOCK
答案 1 :(得分:0)
非常。
有一点需要注意:如果你设置MSG_WAITALL
,每次有些数据到达时,至少有一个实现(FreeBSD)会重新启动计时器。例如,如果您要求recv
8192个字节并且一个字节到达,the timer is reset。如果另一个字节在10秒内到达,则计时器再次重置。因此,如果字节每5秒钟一次涓流,你将等待(8191 * 5)= 40955秒=超过11小时recv
最终返回8192.(如果没有足够的字节到达EOF之前recv
失败了EAGAIN
。)
文档暗示(至少对我来说)即使没有MSG_WAITALL
也是如此,但测试表明此警告仅适用于MSG_WAITALL
案例。