TCP通信 BeginReadについての調査結果

アリスです。

 

1.BeginReadの前に、データが来ているかチェック

if( ns.DataAvailable)
{
   IAsyncResult ar = ns.BeginRead(readBytes, 0, readBytes.Length, null, null);
}

 

この方法だと、普通に実行した場合、データがまだきておらず、読み込みができなかった。

ステップ実行だと、ゆっくりなので必ずif分のなかにはいるのだが。。

 

2.読み込みサイズが256バイト以下だったら、読み込み停止

 

int readSize = ns.EndRead(ar);

if (readSize < 256)
{
   Break;
}

この方法は駄目。複数回受信するコマンドの場合に駄目。最初の1回目が33バイトで、2回目が256バイトとなるパターンがあった。

これもステップ実行だと、ちゃんとうまくいくのだが・・

 

3.無限ループにした

 

byte[] readBytes = new byte[256];
while (true)
{
   IAsyncResult ar = ns.BeginRead(readBytes, 0, readBytes.Length, null, null);
   if (ar.AsyncWaitHandle.WaitOne(timeout) == false)
   {
       break;
   }
   int readSize = ns.EndRead(ar);
   ms.Write(readBytes, 0, readSize);
}
タイトルとURLをコピーしました