仅为recv设置超时

时间:2015-03-27 00:58:26

标签: c linux sockets

我目前在项目中使用套接字,我希望在recv函数中设置5秒的超时。我在this question中找到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));  

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

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

是的,SO_RCVTIMEO将解决您的问题。但是,在这种情况下,如果您正在为多个客户端工作,则必须为每个客户端的每个套接字使用SO_RCVTIMEO。如果要避免这种情况,请使用select()函数并在select()调用上设置超时。 select()将以三种情况返回

  1. 如果在发生任何有趣的事情之前超时到期,则返回0
  2. 出错时,返回-1
  3. 返回三个返回的描述符集中包含的文件描述符数
  4. 所以使用select(),你不必担心连接多少客户端,超时后你可以重新开始。