套接字是否可以仅为recv()函数设置为非阻塞?

7 c c++ sockets windows

我希望能够在recv()不必阻止的情况下进行调用,因此我希望将其设置为非阻塞,但我不希望它在发送数据时不阻塞.那么套接字是否只能为该recv()函数进行非阻塞,或者阻塞/非阻塞模式是否会影响所有套接字函数?

Chr*_*phe 5

对于Windows,您可以使用ioctlsocket()将套接字设置为非阻塞模式。不幸的是,这些设置适用于套接字上的所有操作。因此,对于您的情况,您必须在接收和发送之间切换。

郑重声明: 对于 Linux,您可以在调用参数中使用该MSG_DONTWAIT标志recv()。单个调用将是非阻塞的。

  • 它不可移植,因为它不是标准标志。例如,它在 Windows winsock 库中不可用。 (2认同)

小智 2

没有办法仅针对该函数使套接字成为非阻塞recv()

然而,有一些接近的东西(但有缺陷),那就是ioctlsocket()FIONREAD标志一起使用。例如:

unsigned long l;
ioctlsocket(s, FIONREAD, &l);
Run Code Online (Sandbox Code Playgroud)

该函数将返回(立即不阻塞)有多少字节可供读取,虽然不太准确(但我们不关心这一点,因为我们用它来知道是否有数据要读取而不是知道到底有多少字节)。

正如我之前提到的,这种方法是有缺陷的,因为它不会告诉您另一端何时断开连接,因为断开连接时recv()返回,并且如果没有可用数据,则该函数将返回!00