我希望能够在不必阻止的情况下调用recv()
,因此我希望将其设置为非阻塞,但我不希望它在发送数据时不阻塞。那么套接字是否可以仅对recv()
函数进行非阻塞,或者阻塞/非阻塞模式是否会影响所有套接字函数?
答案 0 :(得分:2)
对于Windows,您可以使用ioctlsocket()
将套接字设置为非阻塞模式。不幸的是,这些设置适用于套接字上的所有操作。因此,对于您的情况,您必须在接收和发送之间切换它。
对于记录:
对于linux,您可以在recv()
调用参数中使用MSG_DONTWAIT
标志。单个呼叫将是非阻塞的。
答案 1 :(得分:0)
无法仅为recv()
函数设置套接字非阻塞。
然而,有一些接近(但有缺陷),即ioctlsocket()
使用FIONREAD
标志。例如:
unsigned long l;
ioctlsocket(s, FIONREAD, &l);
此函数将返回(立即无阻塞)可读取的字节数,虽然不太准确(但我们并不关心,因为我们使用它来知道是否有数据需要读取和不确切知道有多少字节。
正如我之前提到的,这种方法存在缺陷,因为它没有告诉你何时另一端断开连接,因为recv()
在断开连接时返回0
,并且此函数将返回{{ 1}}如果没有数据可用!