2017-01-14 1 views
0

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!

Antwort

0

Die Lösung bestand darin, ein separates SocketAsyncEventArgs für beide Send und Receive zu erstellen.

Es dauert ein wenig mehr Speicher, aber nicht viel, da kein Puffer zu den Send Args zugewiesen werden muss.

Verwandte Themen