首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字是否只能为recv()函数设置为非阻塞?

套接字是否只能为recv()函数设置为非阻塞?
EN

Stack Overflow用户
提问于 2015-02-21 02:59:33
回答 2查看 12.4K关注 0票数 9

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-22 16:32:59

没有办法使套接字只对recv()函数是非阻塞的。

然而,有一些类似的东西(但有缺陷),那就是通过使用带有FIONREAD标志的ioctlsocket()。例如:

代码语言:javascript
复制
unsigned long l;
ioctlsocket(s, FIONREAD, &l);

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-02-21 03:14:54

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

记录的 For linux,您可以在recv()调用参数中使用MSG_DONTWAIT标志。然后,单个调用将是非阻塞的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28636286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档