我希望能够在不阻塞的情况下调用recv(),因此我希望它是非阻塞的,但我不希望它在发送数据时是非阻塞的。那么,套接字是否只能为recv()函数设置为非阻塞,或者阻塞/非阻塞模式是否会影响所有套接字函数?
发布于 2015-02-22 16:32:59
没有办法使套接字只对recv()函数是非阻塞的。
然而,有一些类似的东西(但有缺陷),那就是通过使用带有FIONREAD标志的ioctlsocket()。例如:
unsigned long l;
ioctlsocket(s, FIONREAD, &l);此函数将返回(立即无阻塞地)可读取的字节数,尽管不是很准确(但我们并不关心这一点,因为我们使用它来知道是否有数据要读取,而不是确切地知道有多少字节)。
正如我前面提到的,这种方法是有缺陷的,因为它不会告诉您另一端何时断开连接,因为recv()在断开连接时返回0,并且如果没有数据可用,此函数将返回0!
发布于 2015-02-21 03:14:54
对于windows,您可以使用ioctlsocket()将套接字设置为非阻塞模式。不幸的是,这些设置适用于套接字上的所有操作。因此,对于您的情况,您必须在接收和发送之间进行切换。
记录的: For linux,您可以在recv()调用参数中使用MSG_DONTWAIT标志。然后,单个调用将是非阻塞的。
https://stackoverflow.com/questions/28636286
复制相似问题