问题描述
我编写了一个多线程架构的 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()
超时吗?或者,有没有办法在不改变应用的整个多线程结构的情况下解决问题?
解决方法
我刚刚通过使用解决了它
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
setsockopt(client_socket,SOL_SOCKET,SO_RCVTIMEO,(const char*)&tv,sizeof tv)
在新生成的套接字上的客户端线程中,而不是直接在侦听器套接字上使用它。