非同期受信




コールバック関数を用いて非同期受信を行う。接続にはTCPClientを使用。

private void Connect()
{
client = new TcpClient();
client.Connect(server, port);
callback = new AsyncCallback(Receive);
NetworkStream stream = client.GetStream();
}

private void Receive(IAsyncResult ar)
{
NetworkStream stream = client.GetStream();
int readbyte = stream.EndRead(ar);

// データの更新
byte[] newdata = new byte[buffer.Length + readbyte];
buffer.CopyTo(newdata, 0);
Buffer.BlockCopy(received, 0, newdata, buffer.Length, readbyte);
buffer = newdata;

// 取り残しの確認
if(stream.DataAvailable)
asyncresult = stream.BeginRead(received, 0, received.Length, callback, ar.AsyncState);
else
{
packet = CreatePacket(buffer); // バイト列から変換
buffer = new byte[0];
}
}

あとは必要に応じて

stream.BeginRead(received, 0, received.Length, callback, null);

を呼び出す。

(追記)

キューじゃなかった。新しくスレッドが作られて受信を行うのでCriticalSectionにしておかないとデータが混ざります。(http://d.hatena.ne.jp/maruguu/20050202)



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です