Ich lerne die Verwendung von SocketAsyncEventArgs mithilfe des MSDN-Lernprogramms. Ich habe mich nur gefragt, wie ich den Server mit Vollduplex-Funktionen implementieren könnte.SocketAsyncEventArgs in einer Duplex-Server-Umgebung?
Momentan lehrt das MSDN-Beispiel, dass Sie einen Server erstellen, der zuerst abhört und dann, wenn etwas empfangen wird, es zurücksendet. Nur dann beginnt der Server wieder zu hören.
Das Problem, das ich mit meiner eigenen Lösung kommen würde ist, dass das SocketAsyncEventArgs
Objekt nur ein Ereignis hat, Completed
die für abgefeuert wird sowohl sendet und empfängt. Es hat keine anderen Ereignisse.
las ich etwas schrecklich übersetzt Website auf, die ich
zwei SocketAsyncEventArgs verwenden müssen, man ein Haar erhält.
-unbekannt
Ich finde es ist eine beunruhigende kleine Menge infromation auf dieser angeblich „enhanced“ Socket-Implementierung ...
Heres ein bisschen von meinem Code so können Sie sehen, was ich vorhabe.
//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");
}
}
Vielen Dank!