能否仅对 recv() 函数使套接字成为非阻塞的?
Can a socket be made non-blocking only for the recv() function?
我希望能够在不阻塞的情况下调用recv()
,所以我想让它成为非阻塞的,但我不希望它在发送数据时是非阻塞的。那么一个套接字是否可以只对 recv()
函数进行非阻塞,或者 blocking/non-blocking 模式是否会影响所有套接字函数?
对于windows,可以使用ioctlsocket()
将套接字设置为非阻塞模式。不幸的是,这些设置适用于套接字上的所有操作。因此,对于您的情况,您必须在接收和发送之间切换。
备案:
对于 linux,您可以在 recv()
调用参数中使用 MSG_DONTWAIT
标志。单个调用将是非阻塞的。
无法仅针对 recv()
函数使套接字成为非阻塞。
然而,有一些接近于此的东西(但有缺陷),这是通过使用 ioctlsocket()
和 FIONREAD
标志。例如:
unsigned long l;
ioctlsocket(s, FIONREAD, &l);
这个函数会return(立即不阻塞)有多少字节可以读取,虽然不是很准确(但我们不关心这个,因为我们用它来知道是否有是要读取的数据,不知道具体有多少字节)。
正如我之前提到的,这种方法是有缺陷的,因为它不会告诉你另一端何时断开连接,因为 recv()
returns 0
on disconnect,如果没有可用数据,此函数将 return 0
!
我希望能够在不阻塞的情况下调用recv()
,所以我想让它成为非阻塞的,但我不希望它在发送数据时是非阻塞的。那么一个套接字是否可以只对 recv()
函数进行非阻塞,或者 blocking/non-blocking 模式是否会影响所有套接字函数?
对于windows,可以使用ioctlsocket()
将套接字设置为非阻塞模式。不幸的是,这些设置适用于套接字上的所有操作。因此,对于您的情况,您必须在接收和发送之间切换。
备案:
对于 linux,您可以在 recv()
调用参数中使用 MSG_DONTWAIT
标志。单个调用将是非阻塞的。
无法仅针对 recv()
函数使套接字成为非阻塞。
然而,有一些接近于此的东西(但有缺陷),这是通过使用 ioctlsocket()
和 FIONREAD
标志。例如:
unsigned long l;
ioctlsocket(s, FIONREAD, &l);
这个函数会return(立即不阻塞)有多少字节可以读取,虽然不是很准确(但我们不关心这个,因为我们用它来知道是否有是要读取的数据,不知道具体有多少字节)。
正如我之前提到的,这种方法是有缺陷的,因为它不会告诉你另一端何时断开连接,因为 recv()
returns 0
on disconnect,如果没有可用数据,此函数将 return 0
!