套接字SO_SNDTIMEO超时是设定值的两倍

时间:2014-02-14 15:46:04

标签: sockets timeout gstreamer

如果网络连接在有线/无线之间切换,我最近修补了我的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秒。有什么关于套接字我不明白可能会导致这种行为吗?我真的很想知道这里发生了什么。

1 个答案:

答案 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来获得所需的结果: