いろんなものはつながっている

ReceiveAsyncによるデータ受信

データの受信は、SocketAsyncEventArgsのバッファを用いて行うため、
SocketAsyncEventArgs.SetBufferでバッファを確保してあげる必要がある。

ただ、SocketAsyncEventArgsごとにバッファを作成していると効率がよくないので、バッファ領域をドカッと作っておいて、各SocketAsyncEventArgsが使い回しするのがよいみたい。

MSDNによるとBufferManagerクラスでバッファを一括で管理している。

受信した際にはCompletedイベントが発生する。ReceiveAsyncに渡すSocketAsyncEventArgs.CompletedにはAcceptとは別のイベントハンドラを登録しておく。イベントハンドラの中では、SocketAsyncEventArgs.LastOperationを参照して受信の際のイベントなのか、送信の際のイベントなのかを判断している。

 void IO_Completed(object sender, SocketAsyncEventArgs e)
    {
        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");
        }       

    }

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク