2017-04-12 10 views
0

私は、Pythonプログラムが起動し、C#プログラムをテストし、テストが終了した後に終了するテストスイートに取り組んでいます。再接続後にTCPデータが失われました。

C#プログラムにはTCPサーバーがあり、テストするためのアクションがいくつか発行されます。

ただし、時々データが失われます。私は、TCPデータをキャプチャし、コードを通じてデバッグしましたが、正確な理由を見つけることはできません。ダンプは私には非常に奇妙に見える、多分あなたが助けることができる?

Wireshark Screenshot

773まで

フレーム1つの試験(ポート49xxx上のPython、2000年にC#)を示しています。データが交換されると、Pythonは771で接続を閉じます。この部分は機能します。

RSTが773で送信される理由はわかりませんが、私はTCPのエキスパートではありません。

774からは、C#アプリケーションが再起動され、Pythonはそれに接続しようとします。これは奇妙に見えます。データは779と781で送信されますが、C#では表示されません。

ここで私のアプリケーションがハングアップし、Pythonは応答を待っています.C#はデータの取得を待ちます。

+0

これはおそらくローカルホスト上のすべてを実行しているので問題ではありませんが、私はそこから投げ捨てます。あなたは管理者としてログインしていますか?そうでない場合は、これらのプログラムを管理者として実行していますか?管理者として実行していない場合、Windowsが信頼できないソフトウェアからのネットワーク接続を強制終了するケースがあります。 – rtaft

+0

トレースには、一緒に発生している一連のACKがあります。これは、接続の受信側が送信レートに追いついていないことを示します。また、パケットが再送信されていることを示すシーケンス番号が繰り返されています。私はパケットが再送信される前に時間を増やそうとします。接続の受信側は遅く、パケットを再送するackパケットは実行していません。最終的に接続の送信側はパケットのための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); 
} 

これは、incomming接続を処理するC#側のコードです。ドキュメントを掘り下げた後、asyncResult.AsyncWaitHandleには内部状態がないようです。 WaitOneは、WaitOneが実行される時間内に通知された場合にのみtrueを返します。

私は多くのManualResetEventsを使い果たしたので、私はその点を逃しました。したがって、接続要求がBeginAcceptTcpClientとそれに続くWaitOneの間で受け入れられた場合、コードは停止します。

関連する問題