Techracho

TcpListenerを使ったTCPサーバ

このエントリーをはてなブックマーク Share
2009.01.26    C#, Web, Windows, ネットワーク, 馬場   タグ: , —    baba   

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アドレス」といっても、サーバマシンのアドレスでは無く、クライアントのアドレスを渡します。わかりにくい。。

127.0.1.1

このエントリーをはてなブックマーク Share
    Linux, 中井      hiko   

FTPの設定をしている時にはまったのですが、下記のようなログがでてうまくいかなかったので何なのかと思って調べてみると、

Ubuntu(Debian)のバグ?というか/etc/hostsに勝手に書かれた設定の影響みたいです。

> Jan 17 12:34:50 xxxx proftpd[18744] xxxx.xxxxx.xxx: 127.0.1.1:21 masquerading as
127.0.1.1
(あるのかわかりませんが)意図があるのだとしても、これによって動かなくなるソフトウェアはあるようなので、

ネットワーク周りを扱うソフトウェアでかつDebian系列で、はまった時は/etc/hostsの設定を見直してみることをお勧めします。

<参考>

http://itmst.blog71.fc2.com/blog-entry-100.html

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.