繁体   English   中英

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

[英]Can a socket be made non-blocking only for the recv() function?

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

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

对于记录:对于linux,您可以在recv()调用参数中使用MSG_DONTWAIT标志。 单个呼叫将是非阻塞的。

没有办法只为recv()函数使套接字无阻塞。

然而,有一些接近(但有缺陷),这是通过使用带有FIONREAD标志的ioctlsocket() 例如:

unsigned long l;
ioctlsocket(s, FIONREAD, &l);

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

正如我刚才所说,这种方法是有缺陷的,当另一端已经断开,因为它不会告诉你,因为recv()返回0上断开,而这个函数会返回0 ,如果没有数据可用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM