【问题标题】:Socket SO_SNDTIMEO Timout is double the set valueSocket SO_SNDTIMEO 超时是设置值的两倍
【发布时间】:2016-04-15 16:32:41
【问题描述】:

如果网络连接在有线/无线之间切换,我最近修补了我的 GStreamer 0.10.36 副本以使 tcpclientsink 超时(更多信息请访问Method to Cancel/Abort GStreamer tcpclientsink Timeout)。这是一个简单的改变。我刚刚在 gsttcpclientsink.c 的gst_tcp_client_sink_start() 函数中添加了以下内容:

struct timeval timeout;
timeout.tv_sec = 60;
timeout.tv_usec = 0;
...
setsockopt (this->sock_fd.fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));

奇怪的是,实际超时时间(以挂钟时间衡量)总是我设置的值的两倍。如果我在超时设置为 60 秒的情况下中断网络连接,则 GStreamer/socket 将需要 120 秒才能中止。如果我将超时设置为 30 秒,则需要 60 秒。如果我将超时设置为 180 秒,则需要 360 秒。是否有一些我不明白的套接字可能导致这种行为?我真的很想知道这里发生了什么。

【问题讨论】:

    标签: sockets timeout gstreamer


    【解决方案1】:

    这可能与 Socket SO_RCVTIMEO Timeout is double the set value in C++/VC++ 重复

    我在下面粘贴我的答案,因为我认为我遇到了类似的问题。

    粘贴的答案

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

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

    参考文献

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 2019-06-16
      • 2015-01-31
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多