仅为recv设置超时

Jca*_*o02 1 c sockets linux

我目前正在项目中使用套接字,我想在recv函数中设置5秒的超时.我在这个问题中发现,setsockopt使用SO_RCVTIMEO选项,应该这样做,但问题是它也会影响accept()函数,我只想要recv()函数超时.以下是我设置超时的方法:

/*Setting timeout for bad headers*/                                                                                                                                                                                                  
struct timeval tv;                                                                                                                                                                                                                   
tv.tv_sec = 5; /* 5 seconds timeout for receiving a request */                                                                                                                                                                       
tv.tv_usec= 0;                                                                                                                                                                                                                       
setsockopt(fd, SOL_SOCKET, 
           SO_RCVTIMEO,(struct timeval *)&tv, 
           sizeof(struct timeval));  
Run Code Online (Sandbox Code Playgroud)

这个想法是,如果客户端发送损坏的标头(例如,消息长度不正确),则线程最多等待5秒钟以丢弃请求.

那么,是否可以仅为recv()函数设置此超时而不影响accept()函数?如果是这样,我该怎么办?

dus*_*uff 8

SO_RCVTIMEO选项仅影响您设置它的文件描述符 - 如果您在侦听套接字上设置它,它将使accept()该套接字上的调用超时; 如果你在连接的套接字上设置它,它将使recv()该套接字上的调用超时.没有套接字可以同时拥有accept()recv()调用它,因此不需要区分.