2017-04-12 141 views
0

我正在開發一個測試套件,一個Python程序啓動並測試一個C#程序並在測試完成後終止它。 C#程序多次啓動,一個接一個(所以啓動,測試,殺死,啓動,測試,殺死等)重新連接後TCP數據丟失。

C#程序有一個TCP服務器,Python連接到它併發出一些要測試的動作。

但是,數據不時會丟失。我捕獲了TCP數據並通過代碼進行調試,但找不到確切的原因。轉儲看起來很奇怪,也許你可以幫忙嗎?

Wireshark Screenshot

幀至多773示出了一個測試(Python的上端口49xxx,C#2000)。數據被交換,然後Python在771關閉連接。這部分工作。

我不知道爲什麼RST是在773發送的,但我不是tcp專家。

從774開始,C#應用程序已重新啓動,Python嘗試連接到它。這看起來很奇怪。數據在779和781中發送,但不在C#中顯示。

在這裏,我的應用程序掛起,Python等待響應,C#等待傳入數據。

+0

這可能不是問題,因爲你正在本地主機上運行一切,但我會把它扔到那裏。你是否以管理員身份登錄?如果沒有,你是否以管理員身份運行這些程序?如果您沒有以管理員身份運行,我已經看到了Windows將終止來自不可信軟件的網絡連接的情況。 – rtaft

+0

如果您注意到跟蹤中存在大量一起發生的ACK。這表明連接的接收方沒有跟上發送速率。您還會注意到序列號正在重複,表示數據包正在重新發送。我會嘗試增加發送數據包之前的時間。連接的接收端運行緩慢,而不是導致數據包重新發送的確認數據包。最終連接的發送方關閉,因爲它沒有得到分組的確認。 – jdweng

+0

也許我不明白你的意思,但我在日誌中看不到一次重發。連接的兩端都發送和接收,數據傳輸率很低。 從774開始,客戶端源端口發生更改,因此它是不同的連接。 – Johannes

回答

0

猜猜我發現了這個問題。以上wireshark的輸出引導了我錯誤的方向,即使wireshark將傳輸標記爲紅色/黑色,我認爲它越多,看起來就越完美。

IAsyncResult asyncResult=null; 
while(!_abort.WaitOne(0)) 
{ 
    if(asyncResult==null) 
    asyncResult=_tcpListener.BeginAcceptTcpClient(null, null); 

    var waitResult=asyncResult.AsyncWaitHandle.WaitOne(1000); 
    if(!waitResult) continue; 

    var tcpClient=_tcpListener.EndAcceptTcpClient(asyncResult); 
    asyncResult=null; 

    _newClientHandler(tcpClient); 
} 

這是C#端處理輸入連接的代碼。挖掘到文檔後,似乎asyncResult.AsyncWaitHandle沒有內部狀態。如果WaitOne在WaitOne運行時間內發出信號,則WaitOne只返回true。

因爲我使用了大量的ManualResetEvents,所以我錯過了這一點。因此,如果在BeginAcceptTcpClient和下面的WaitOne之間接受連接請求,則代碼會卡住。

相關問題