如何在 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?