如果网络连接在有线/无线之间切换,我最近修补了我的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秒。有什么关于套接字我不明白可能会导致这种行为吗?我真的很想知道这里发生了什么。
答案 0 :(得分:0)
这可能与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。
讨论这个问题(阅读评论):
如何使用select来获得所需的结果: