我最近修补了我的 GStreamer 0.10.36 副本,以便在有线/无线之间切换网络连接时使 tcpclientsink 超时(更多信息请参阅取消/中止 GStreamer tcpclientsink 超时的方法)。 这是一个简单的变化。 我刚刚在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 秒。 是否有我不了解的套接字可能导致此行为? 我真的很想知道这里发生了什么。
套接字SO_RCVTIMEO 超时是 C++/VC++ 中设置值的两倍
我将答案粘贴在下面,因为我认为我遇到了类似的问题。
粘贴的答案
SO_RCVTIMEO和SO_SNDTIMEO不适用于所有套接字操作,则应使用非阻塞模式并select
。
行为可能会在不同的操作系统配置上发生变化。在我的系统上,connect
在两倍于我在SO_RCVTIMEO中设置的值后超时。一个快速的技巧,如将SO_RCVTIMEO设置为在连接之前x/2
,在连接后x
,但正确的解决方案是使用 select。
引用
关于这个问题的讨论(阅读评论来回答):
- https://stackoverflow.com/a/4182564/4074995
如何使用选择来获得所需的结果:
- http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select
- C:套接字连接超时