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

问题描述

我编写了一个多线程架构的 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) 

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