2013-02-15 204 views
2

我使用QTCPSocket連接到TCP服務器(它運行在Ubuntu上)。服務器至少每40ms發送一個1字節的數據包。我的應用程序是實時的,所以重要的是我儘可能快地接收數據,但需要額外的網絡通信量。Windows套接字TCP客戶端每200毫秒接收一次數據(QTCPSocket)

從Windows連接TCP客戶端後,我開始接收數據包。但是,QTCPSocketreadyRead()信號只能每200毫秒發送一次(包中有5個字節)。我看過Wireshark中的數據包,它們實際上是5字節的數據包。

但是,在Mac上使用QTCPSocket(實際上是完全相同的代碼),我每次都得到單獨的數據包,所有發送的1字節數據包都以單字節數據包的形式發送,這非常棒。

我試着創建一個原始的Windows套接字(不使用QTCPSocket),並在Windows上獲得與QTCPSocket相同的行爲。

導致Mac套接字以更高時間分辨率接收數據包的區別是什麼?有什麼我可以在setsockopt()設置,這將防止200毫秒的緩衝發生?

我知道在服務器端設置TCP_NODELAY可能會解決我的問題,但看到Mac TCP Client按預期工作時,必須有一種方法可以在Windows上獲得相同的行爲。

+0

設置'mySocket-> setSocketOption(QAbstractSocket :: LowDelayOption,1);'在服務器端是我發現的唯一方法來解決這個問題 – oggmonster 2013-02-15 15:48:23

+0

您嘗試先修復協議?因爲這對我來說一直都很有用。 – 2013-02-15 16:53:21

+0

TCP是一個流媒體協議。對於這種用法,UDP可能會更好。 – 2013-02-15 20:17:06

回答

0

設置mySocket-> setSocketOption(QAbstractSocket :: LowDelayOption,1);在服務器端是我已經找到了解決這個問題

-1

您需要確認您收到的每個字節的數據,以使答覆能夠確認一些數據捎帶。與任何設計你的協議的人交談。

試圖回答諸如「爲什麼它在X而不在Y上工作」這樣的問題只在兩種行爲不正確時纔有用。如果它沒有應用程序級別的確認,那麼這兩種行爲都是正確的。如果其中一個不應該是正確的,那麼協議應該有一個機制來控制它,比如應用層確認。如果它沒有破壞協議。試圖弄清楚爲什麼一個破壞的協議不起作用是毫無意義的 - 它不起作用,因爲它被破壞了。

0

對於其他人在這個誰絆倒從搜索引擎來的唯一方法:

通過oggmonster以上(正確)的答案也被描述爲:

int on = 1; 
if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on))) 
    { 
    return -1; 
    } 
相關問題