【问题标题】:Socket SO_RCVTIMEO Timeout is double the set value in C++/VC++Socket SO_RCVTIMEO Timeout 是 C++/VC++ 中设定值的两倍
【发布时间】:2014-12-05 13:00:12
【问题描述】:

请显示以下示例

int val = 120000;
setsockopt(connSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&val,sizeof(int));

我将接收超时设置为 120 秒,但需要 240 秒。

我认为超时是设定值的两倍。

这怎么可能?

【问题讨论】:

  • 您检查以确保setsockopt() 没有返回错误吗?您希望将超时应用于什么代码?请提供一个SSCCE,以显示双重时间的作用。

标签: c++ sockets visual-c++


【解决方案1】:

SO_RCVTIMEO 和 SO_SNDTIMEO 不适用于所有套接字操作,您应该使用非阻塞模式和select

行为可能会因不同的操作系统配置而改变。 在我的系统上,connect 在两倍于我在 SO_RCVTIMEO 中设置的值后超时。一个快速的技巧,比如在连接之前将 SO_RCVTIMEO 设置为 x/2,在连接之后设置为 x,但正确的解决方案是使用 select。

参考文献

关于这个问题的讨论(阅读cmets来回答):

如何使用 select 来获得想要的结果:

【讨论】:

    【解决方案2】:

    SO_RCVTIMEO 不接受 int 作为超时。你正在寻找这样的东西:

    struct timeval tv = {
        .tv_sec = 120
    };
    
    setsockopt(connSock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2018-07-14
      • 2019-06-16
      • 1970-01-01
      相关资源
      最近更新 更多