首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字超时:选择vs setsockopt

套接字超时:选择vs setsockopt
EN

Stack Overflow用户
提问于 2021-06-08 06:16:59
回答 1查看 650关注 0票数 5

我使用超时来发送和接收套接字上的数据。我发现,可以通过将套接字设置为非阻塞模式并使用select或使用带有SO_SNDTIMEO/SO_RCVTIMEO选项的setsockopt来实现超时。

这两种方法之间有什么不同,对于Linux (Redhat)和Windows,是否有理由选择一种实现而不是另一种实现?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-08 06:50:40

这两种方法之间有什么不同?对于Linux (Redhat)和Windows,是否有理由选择一种实现而另一种呢?

对于Linux,两者之间的差别似乎很小:

指定接收或发送超时,直到报告错误。这个论点是一个结构时间。如果输入或输出函数在这段时间内阻塞,并且数据已经发送或接收,则该函数的返回值将是所传输的数据量;如果没有传输数据,并且达到超时,则返回-1,将errno设置为EAGAIN或EWOULDBLOCK,或EINPROGRESS (用于连接(2)),就像指定套接字为非阻塞一样。如果超时设置为零(默认),则操作将永远不会超时。超时只对执行套接字I/O (例如读(2)、recvmsg(2)、发送(2)、sendmsg(2))的系统调用生效;超时对select(2)、轮询(2)、epoll_wait(2)等没有影响。

来源

但是,您没有像使用例如select那样同时具有多路复用连接的方便属性。对于Windows,差异更为严重:

阻塞发送呼叫的超时,以毫秒为单位。此选项的默认值为零,这表示发送操作不会超时。如果阻塞发送调用超时,则连接处于不确定状态,应该关闭。如果套接字是使用WSASocket函数创建的,那么dwFlags参数必须设置WSA_FLAG_OVERLAPPED属性以使超时正常运行。否则超时永远不会生效。

来源

因此,超时之后,套接字是不可用的(这可能不是您想要的行为)。由于两个Berkely套接字实现之间的行为不同,我不建议使用setsockopt(SO_SNDTIMEO/SO_RCVTIMEO),而是使用基于这个原因创建的工具,例如select,或者更好的是使用一个适当的网络套接字库,比如boost::asio。

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

https://stackoverflow.com/questions/67882330

复制
相关文章

相似问题

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