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

AcceptAsyncによるAccept

ここを参考にAcceptAsyncを使用方法を整理してみた

Listen用のSocketを作成

まず、Listen用のSocketを作成して、
listenSocket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

Acceptを非同期に待つため、
listenSocket.AcceptAsync(acceptEventArg);
を実行する。

AcceptAsyncには、引数にSocketAsyncEventArgsをわたす。
この引数、SocketAsyncEventArgs(※)はAccept用として使いまわしする。

クライアントから接続

クライアントからの接続があると
listenSocket.Acceptにわたした引数のSocketAsyncEventArgsの
Completedイベントが発生する。

Completedイベントのイベントハンドラはあらかじめ
listenSocket.Acceptにわたした引数のSocketAsyncEventArgsに登録しておく。

Completedイベントのイベントハンドラの引数には
SocketAsyncEventArgsが渡される。
この引数(SocketAsyncEventArgs)のAcceptSocketには、
新規に作成されたSocketがセットされている。
その後、このSocketでデータの送受信が行われる。

データ受信の待ちうけ

データ受信の待ちうけをするため、新規に作成されたSocketのReceiveAsyncを実行し、受信待ち状態にする。
bool willRaiseEvent = e.AcceptSocket.ReceiveAsync(readEventArgs);

ReceiveAsyncに渡す引数には、あらかじめ作成しプールしておいたSocketAsyncEventArgsを
用いている。
SocketAsyncEventArgs readEventArgs = m_readWritePool.Pop();

再度、Accept待機に入る

Accept待機→Accept→データ受信待機と遷移したのち、再度Accept待ち状態に入る。
その際には、(※)のSocketAsyncEventArgsを用いる。
(※)のSocketAsyncEventArgsは、Acceptした際に新規に生成されたSocketを、
Completedイベントのイベントハンドラに渡すだけの役割を担っているということかな。

SocketAsyncEventArgs.UserTokenの使いかた

callback関数の中で参照したいものがあればいれればUserTokenに設定しなさいとのこと。

The caller may set the SocketAsyncEventArgs.UserToken property to any user state object desired before calling the ReceiveAsync method, so that the information will be retrievable in the callback method. If the callback needs more information than a single object, a small class can be created to hold the other required state information as members.

MSDNの例はAcceptをうけ新規に生成されたSocetを設定している。
((AsyncUserToken)readEventArgs.UserToken).Socket = e.AcceptSocket;

AcceptSocketはあらかじめ設定しておくこともできる

あらかじめ使用するsocketを指定することもできるみたい。どのような使いかたをするのだろう。

The caller can optionally specify an existing Socket to use for the incoming connection by specifying the Socket to use with the SocketAsyncEventArgs.AcceptSocket property.

AcceptSockeにあらかじめ何も設定しない場合、自動的に新規に生成する。

If the SocketAsyncEventArgs.AcceptSocket property is null, a new Socket is constructed with the same AddressFamily, SocketType, and ProtocolType as the current Socket and set as the SocketAsyncEventArgs.AcceptSocket property.

関連記事

コメント

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

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

スポンサード リンク

カテゴリー

スポンサード リンク