TcpListenerを使ったTCPサーバ

このエントリーをはてなブックマーク Share

C#のTcpListenerを使って、サーバを作っていています。

System.Net.Sockets.Socket.Available プロパティは、信用してはいけません。
下のコードは、クライアントから接続があってもたまにしか受信できません。

using (Socket client = listener.AcceptSocket())
{
  //ここにThread.Sleep(1000)とかを入れるとうまく動くことも多い・・・

  while (client.Available) //ここでいきなりfalseが返ってくる
  {
    byte[] buf = new byte[256];
    client.Receive(buf);
    Console.WriteLine(Encoding.ASCII.GetString(buf));
  }
}

この場合、次のようにするのが正しいです。

using (Socket client = listener.AcceptSocket())
{
  byte[] buf = new byte[256];
  int bytes;
  while ((bytes = client.Receive(buf)) > 0)
  {
    Console.WriteLine(Encoding.ASCII.GetString(buf));
  }
}

それから、TcpListenerのコンストラクタは第一引数にローカルIPアドレス、第二引数にポート番号を渡しますが、サーバに置いては
TcpListener listener = new TcpListener(IPAddress.Any, 45678);
のように IPAddress.Any を渡すのが正しいです。「ローカルIPアドレス」といっても、サーバマシンのアドレスでは無く、クライアントのアドレスを渡します。わかりにくい。。

Tags: ,

Bookmark and Share

Comment / Trackback

コメントはまだありません。

コメントフォームは現在閉鎖中です。