2017-01-14 9 views
0

私は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"); 
      } 

     } 

ありがとう!

答えて

0

解決策は、SendReceiveの両方に対して別々のSocketAsyncEventArgsを作成することでした。

バッファをSend argsに割り当てる必要がないため、メモリが少し必要です。

関連する問題