私はMSDNチュートリアルを使用してSocketAsyncEventArgsのものを使用する方法を学んでいます。私はちょうどいくつかのこと、つまり全二重機能を備えたサーバーの実装方法について疑問を抱いていました。二重サーバー環境でのSocketAsyncEventArgs?
現在のところ、MSDNの例では、最初にリッスンし、何かが受信されたときに返信するサーバーを作成するように教えています。 のみ、サーバは再びリスニングを開始します。
私は私自身の解決策を考え出すが午前問題は、SocketAsyncEventArgs
オブジェクトが両方送受信するために解雇された唯一のイベント、Completed
を持っているということです。他のイベントはありません。私は私
は2つのSocketAsyncEventArgsを使用しなければならないいくつかの恐ろしく翻訳サイトで読ん
、一つは髪を受け取ります。
- 私はのinfromationの不安な少量のこのはずの「強化」ソケット実装であり見つける不明
...
HERESに私のコードを少しあなたが見ることができるので、私は何をしているのか。
//Called when a SocketAsyncEventArgs raises the completed event
private void ProcessReceive(SocketAsyncEventArgs e)
{
Token Token = (Token)e.UserToken;
if(e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
{
Interlocked.Add(ref TotalBytesRead, e.BytesTransferred);
Console.WriteLine(String.Format("Received from {0}", ((Token)e.UserToken).Socket.RemoteEndPoint.ToString()));
bool willRaiseEvent = ((Token)e.UserToken).Socket.ReceiveAsync(e);
if (!willRaiseEvent)
{
ProcessReceive(e);
}
}
else
{
CloseClientSocket(e);
}
}
private void ProcessSend(SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
// done echoing data back to the client
Token token = (Token)e.UserToken;
// read the next block of data send from the client
bool willRaiseEvent = token.Socket.ReceiveAsync(e);
if (!willRaiseEvent)
{
ProcessReceive(e);
}
}
else
{
CloseClientSocket(e);
}
}
void IOCompleted(object sender, SocketAsyncEventArgs e)
{
// determine which type of operation just completed and call the associated handler
switch (e.LastOperation)
{
case SocketAsyncOperation.Receive:
ProcessReceive(e);
break;
case SocketAsyncOperation.Send:
ProcessSend(e);
break;
default:
throw new ArgumentException("The last operation completed on the socket was not a receive or send");
}
}
ありがとう!