我希望能够在recv()
不必阻止的情况下进行调用,因此我希望将其设置为非阻塞,但我不希望它在发送数据时不阻塞.那么套接字是否只能为该recv()
函数进行非阻塞,或者阻塞/非阻塞模式是否会影响所有套接字函数?
对于Windows,您可以使用ioctlsocket()
将套接字设置为非阻塞模式。不幸的是,这些设置适用于套接字上的所有操作。因此,对于您的情况,您必须在接收和发送之间切换。
郑重声明:
对于 Linux,您可以在调用参数中使用该MSG_DONTWAIT
标志recv()
。单个调用将是非阻塞的。
小智 2
没有办法仅针对该函数使套接字成为非阻塞recv()
。
然而,有一些接近的东西(但有缺陷),那就是ioctlsocket()
与FIONREAD
标志一起使用。例如:
unsigned long l;
ioctlsocket(s, FIONREAD, &l);
Run Code Online (Sandbox Code Playgroud)
该函数将返回(立即不阻塞)有多少字节可供读取,虽然不太准确(但我们不关心这一点,因为我们用它来知道是否有数据要读取而不是知道到底有多少字节)。
正如我之前提到的,这种方法是有缺陷的,因为它不会告诉您另一端何时断开连接,因为断开连接时recv()
返回,并且如果没有可用数据,则该函数将返回!0
0