我希望能够调用recv()
而不必阻塞,因此我想要将其设置为非阻塞模式,但我不希望在发送数据时也变为非阻塞模式。所以,是否可以仅使recv()
函数的套接字变为非阻塞模式,或者阻塞/非阻塞模式会影响所有套接字函数?
ioctlsocket()
将套接字设置为非阻塞模式。不幸的是,这些设置适用于套接字上的所有操作。因此,在您的情况下,您必须在接收和发送之间切换它。
记录一下:
对于Linux,您可以在recv()
调用参数中使用MSG_DONTWAIT
标志。单个调用将成为非阻塞。unsigned long l; ioctlsocket(s, FIONREAD, &l);
来检查是否有数据可读? - user4182981ioctlsocket(s, FIONREAD, &l);
也将套接字设置为非阻塞模式!看,我想要的不是看有多少数据可用,而是只想知道是否有数据可供读取。这难道不应该让我看到:recv(s, buffer, 1024, MSG_PEEK)
吗?但对我来说它不起作用,recv()
仍然被阻塞了。 - user4182981无法使套接字仅对 recv()
函数非阻塞。
然而,有一种类似但有缺陷的方法,可以使用带有 FIONREAD
标志的 ioctlsocket()
。例如:
unsigned long l;
ioctlsocket(s, FIONREAD, &l);
MSG_PEEK
标志来查看是否有任何内容可接收。或者使用例如零超时的select
。然而,对于 TCP 套接字,这些方法仅适用于告诉您至少有 一个 字节可供接收,您不知道实际可用量。 - Some programmer dudeMSG_PEEK
,recv()
仍然会阻塞。 - user4182981