4
ソケットを1つしか使用しない単純なソケットクライアントを作成しています。だから私はすべての受信操作のために単一のSocketAsyncEventArgsを再利用できると考えました。ソケットが接続されている限り正常に動作しています。サーバーが切断すると、クライアントはコンソールに「Receive Success」というスパムを送信する無限受信ループに入ります。SocketAsyncEventArgsをReceiveAsyncと再利用して無限ループの結果を返します
ソケットが切断されたときにe.SocketError!= SocketError.Successをtrueにしないでください。ここで
は、コードの一部です:あなたのソケットはバイトストリーム用に設定されている場合、あなたはゼロバイトでコールバックを得ることができます
private void Completed(object sender, SocketAsyncEventArgs e)
{
if (e.SocketError != SocketError.Success)
status = 0;
System.Console.WriteLine(e.LastOperation + " " + e.SocketError);
if (status == 1)
{
switch (e.LastOperation)
{
case SocketAsyncOperation.Connect:
ProcessConnect(e);
break;
case SocketAsyncOperation.Receive:
ProcessReceive(e);
break;
case SocketAsyncOperation.Send:
ProcessSend(e);
break;
default:
status = 0;
break;
}
}
if (status != 1)
CloseSocket();
}
private void ProcessReceive(SocketAsyncEventArgs e)
{
if (!socket.ReceiveAsync(e))
Completed(null, e);
}
ありがとうございます。それは単純な洞察であり、それは問題を解決しました:) – remdao
おそらく、あなたは私の答えを正確に '刻む'ことができましたか? :) –