2014-02-14 21 views
1

如果網絡連接在有線/無線之間切換(更多信息,請參閱Method to Cancel/Abort GStreamer tcpclientsink Timeout),我最近修補了我的GStreamer 0.10.36副本以超時tcpclientsink。這是一個簡單的改變。我只是說了以下內容gsttcpclientsink.c的gst_tcp_client_sink_start()功能:Socket SO_SNDTIMEO Timout是設置值的兩倍

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

奇怪的是,實際的超時(按掛鐘時間計算)總是雙I設置的值。如果我在超時設置爲60秒的情況下中斷網絡連接,GStreamer /套接字將中止120秒。如果我將超時設置爲30秒,則需要60秒。如果我將超時設置爲180秒,則需要360秒。有什麼關於套接字,我不明白,可能會導致此行爲?我真的很想知道這裏發生了什麼。因爲我覺得我有一個類似的問題

回答

0

這可能是Socket SO_RCVTIMEO Timeout is double the set value in C++/VC++

重複我貼我的回答如下。

粘貼的答案

SO_RCVTIMEO和SO_SNDTIMEO不能在所有插座操作的工作,你應該使用非阻塞模式和select

該行爲可能會在不同的操作系統配置上發生更改。 在我的系統上,在我設置在SO_RCVTIMEO中的值兩倍後,超時值爲connect。一個簡單的黑客就像在連接之前將SO_RCVTIMEO設置爲x/2,並在其工作後將其設置爲x,但正確的解決方案是使用select。

參考

談這個問題(閱讀評論回答):

如何使用選擇才達到期望的結果:

相關問題