2013-02-27 10 views
5

.netソケットを使用してクライアントからデータを受信する際に問題が発生しました。クライアントはTCPと通信しており、直ちに接続を閉じる前に1つまたは2つのパケットを送信しています。レセプションは次のようになります:データを読み取る前にソケット接続をリセットしました

Socket newConnection = listener.EndAccept(ar); 
newConnection.BeginReceive(myBuffer,0, length, SocketFlags.None, Callback,null); 

これ以上実行されません。 beginReceiveは接続がリセットされたことを示すSocketExceptionを即座にスローします。私は受け取ったデータを得ることができません。

SYN // SYN, AKC // AKC 
PSH, ACK for 156 bytes 
PSH, ACK for 176 bytes 
RST, ACK 

そして、それはそれだ:ここでは

は、私はWiresharkの上でこの接続のために見るものです。接続がクライアントによって閉じられていても、この受信データを取得する方法はありますか?

+0

はあなたが閉じる前に、あなたの受信プログラムからのパケットを「認めた」ために、あなたのクライアントは待つことができます方法はありますか? –

+0

私は本当にできません。クライアントは他のサーバーで使用されていて動作しているので、同じことができるはずです。私はこれらの他のサーバーのソースコードにアクセスすることはできませんどのようにそれを参照してください。 –

+0

RSTが到着する前にデータを読み取っていない場合、これはあまりできません(これは、送信者が強制終了を行っていることを示しています)。送信者がFINの代わりにRSTを送信する理由(つまり、[Socket.Shutdown](http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx) )? –

答えて

-1

まず、このタイプの通信では、TCPの代わりにUDPに切り替えることをお勧めします。送信者の状態に関係なくパケットを取得できるようになります。
は、TCPが唯一の選択肢であると仮定すると - 私は同期呼び出しを使用することをお勧めします:

Socket newConnection = listener.AcceptSocket(); 
newConnection.Receive(myBuffer, 0, length, SocketFlags.None); 
+1

UDPを使用するようにクライアントを変更する必要がある場合、RSTを送信しないで変更することもできます。 –

+0

同期呼び出しを使用しても何も変更されません。 AcceptSocket呼び出しが終了しReceiveがスローするまでにソケットはまだリセットされます –

関連する問題