如何在 C 中设置 SO_RCVTIMEO 选项仅用于读取而不用于接受

Posted

技术标签:

【中文标题】如何在 C 中设置 SO_RCVTIMEO 选项仅用于读取而不用于接受【英文标题】:How to set SO_RCVTIMEO option only for read and not for accept in C 【发布时间】:2021-10-04 22:19:33 【问题描述】:

我编写了一个具有多线程架构的 C 服务器。服务器在accept() 上循环以接受传入的连接,并为每个到read() 的连接创建一个新线程。

如果没有收到任何消息,我希望服务器在一定时间后使 read() 失败,但如果我尝试这样做:

struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;

setsockopt(listener_socket_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv)

我的accept() 也超时了。

我可以设置SO_RCVTIMEO 选项以使read() 超时吗?或者,有没有办法在不改变应用整个多线程结构的情况下解决问题?

【问题讨论】:

Err,不要设置在监听socket上? @user207421 我回答了我自己的问题,指出这就是问题所在。我没有立即想到它,因为我看到另一个人对这种方法有问题 AFAIK,SO_RCVTIMEO 不适用于accept(),仅适用于recv/from()read()。使accept() 超时的唯一方法是将侦听套接字置于非阻塞模式,然后使用select()(e)poll() 【参考方案1】:

我刚刚解决了这个问题

struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;

setsockopt(client_socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv) 

在新生成的套接字上的客户端线程中,而不是直接在侦听器套接字上使用它。

【讨论】:

以上是关于如何在 C 中设置 SO_RCVTIMEO 选项仅用于读取而不用于接受的主要内容,如果未能解决你的问题,请参考以下文章

如何在eclipse makefile项目的编译器选项中设置-std=c++0x?

如何在 WebView2 中设置基于选项卡的 cookie?

如何在 ActionBar 标题中设置自定义字体?

使用socket选项SO_RCVTIMEO和SO_SNDTIMEO设置超时时间

如何在 phpMyAdmin 中设置默认主题?

Android偏好总结。如何在摘要中设置 3 行?