2012-06-12 231 views
1

我有一個客戶端套接字在連接握手完成後將圖像數據推送到服務器套接字。和服務器套接字處理它們沒有任何反應客戶端套接字發送,但靜默服務器套接字不接收

它運作良好幾分鐘。但有一段時間後,服務器套接字停止獲取這些數據。我無法弄清楚爲什麼? TCP中是否有這樣的事情,如果客戶端不斷推送數據,服務器必須說些什麼,否則對話將停止?

我在幾年前寫了這個代碼。並使其工作我讓服務器返回一個字符串「ACK」的答覆。但是,如果我將其更改爲任何字符串,它將起作用。

但現在我想弄清楚爲什麼要重建程序。

回答

0

除非您需要發送端接收方的確認,否則與TCP的「單向」通信是完全正常的。但這是您的應用程序級協議。在傳輸級別,數據包仍然以雙向流動的方式傳輸 - TCP在兩個方向上保留序列號,並向另一側確認它們。這允許檢測丟棄/重複的分組並重傳,從而提供流的可靠性。在連接握手過程中協商的窗口大小以及會話生命週期中更新的窗口大小允許TCP減慢快速發送方,從而壓倒慢速接收方。

你真正需要做的就是用嗅探器(如tcpdump(1)wireshark)記錄TCP連接,並找出當「socket停止獲取這些數據」時在線上發生了什麼。

+0

我用wireshak嗅探了交通。我看到的是客戶不斷髮送。但服務器在幾分鐘後沒有收到任何這些數據包。 –

+0

你確定服務器實際上是從套接字讀取的嗎?服務器機器是否發送TCP ACK? –

+0

是的,否則它在最初的幾分鐘內如何工作。我觀察到的是,客戶端先推送數據包,然後服務器處理數據包,並在幾分鐘內快速運行。在此之後,它看起來像一個交通堵塞交通堵塞但它應該很好地處理底層的TCP。但令人驚訝的是,它不是。 –

相關問題