【问题标题】:Set timeout only for recv仅为 recv 设置超时
【发布时间】:2015-05-31 05:50:51
【问题描述】:

我目前在一个项目中使用套接字,我想在 recv 函数中设置 5 秒的超时。我在this question 中发现带有 SO_RCVTIMEO 选项的setsockopt 应该这样做,但问题是它也会影响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() 函数?如果是这样,我该怎么做?

【问题讨论】:

  • 问题是什么?
  • 我投票决定将此问题作为题外话结束,因为没有问题。
  • @iharob 现在问题很明确了。

标签: c linux sockets


【解决方案1】:

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

  1. 如果在有趣的事情发生之前超时到期,则返回 0
  2. 出错时返回-1
  3. 返回三个返回的描述符集中包含的文件描述符的数量

所以使用 select(),您不必担心连接了多少客户端,超时后您可以重新开始。

【讨论】:

    【解决方案2】:

    SO_RCVTIMEO 选项仅影响您设置它的文件描述符——如果您将它设置在侦听套接字上,它将使该套接字上的 accept() 调用超时;如果您将其设置在连接的套接字上,它将使该套接字上的recv() 调用超时。任何套接字都不能同时调用accept() 和recv(),因此无需区分。

    【讨论】:

    • 哦,是的。我将它设置为侦听器套接字而不是新的,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多