2011-07-14 44 views
2

LAN上でUDP通信をテストしようとしています。私は小さなコードを持っています。私は2台のコンピュータでそれを実行しようとしました(1つは受信するのを待つ必要があり、もう1つは送信する必要があります)。奇妙なことは、コンピュータAが送信し、Bが正しく受信されますが、受信しようとすると送信するBを実行しようとすると動作しません。あなたはなぜそれができるのか知っていますか?.NETでUDPパケットを送受信する

public void SendBroadcast(int port, string message) 
    { 
     UdpClient client = new UdpClient(); 
     byte[] packet = Encoding.ASCII.GetBytes(message); 

     try 
     { 
      client.Send(packet, packet.Length, IPAddress.Broadcast.ToString(), port); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

public void Receive(int port) 
    { 
     UdpClient client = null; 

     try 
     { 
      client = new UdpClient(port); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

     IPEndPoint server = new IPEndPoint(IPAddress.Any, 0); 


     while (true) 
     { 
      try 
      { 
       byte[] packet = client.Receive(ref server); 
       Console.WriteLine("{0}, {1}", server, Encoding.ASCII.GetString(packet)); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
    } 

そして通話:

SendBroadcast(444, "hello"); Receive(444); 

私は、同じコンピュータ上のプログラムの2つのインスタンスを実行する場合、それは正常に動作しますが、呼び出しごとに3つのパッケージを作成します。

ありがとうございます。

+0

IPアドレスを明示的に指定し、ブロードキャストに依存しないことは両方向で行いますか? – Tremmors

答えて

1

同じコードが1つのコードで動作し、それ以外のコードで動作しない場合は、自分の環境です。ファイアウォールの設定を確認し、送信者のブロードキャストを妨げていないか、受信者の受信を妨げていないことを確認してください。 Wireshark(またはWindowsのnetmon)もここで役立つはずです。

+0

はい、それは問題です...ありがとう! – Reixons

2

メッセージを送信するためにブロックせずにメッセージを引き続き受信できるように、非同期メソッドを使用してみてください。

+0

あなたは非同期メソッドについて詳述できますか?利用可能なリンクはありますか?ありがとう – WEFX

+0

[ここにはMSDNのドキュメントへのリンクです](http://msdn.microsoft.com/en-us/library/9wkb9k12.aspx)。 'Begin'と 'End'で始まるメソッドを探します。ここにはたくさんの例があります。 – Jay

0

これら2つのシステムにはどのようなネットワーク機器がありますか?

2つのシステムが同じサブネット上にあり、同じサブネットマスクを使用していますか?

IPV4ネットワークで面白いことがあります。複数のbroadcast addressesを持つことができます。ローカルネットワークまたはローカルサブネットにブロードキャストできます。これらは明らかに異なるアドレスであり、あるシステムのIP設定が異なる場合、このローカルサブネットブロードキャストをリッスンする必要があることに気づいていない可能性があります。しようとする

もの:

  1. IPV6は(IPV6は、ブロードキャストアドレスをサポートしていませんが、ちょうどベースラインを確立することができます)両端で無効になっていることを確認してください。
  2. IPアドレスがプログラムに明示的に設定されていますが、動作しますか?私の推測はイエスだろう。だから我々はなぜそれを決定しなければならない。
  3. wiresharkをロードし、パケットを盗聴します。彼らが遠隔ホストにそれを完全に作っているかどうかを見てください。そして、彼はただ無視しています。
-1

これを非同期的に実行しようとすると、マイクロソフトでは、ユーザーにこれと同じように独自の部分クラスを作成することを怠っています(下記参照)。非常に単純ですが、これがなければ、例を読むのは難しいでしょう。

private partial class UdpState 
{ 
    public UdpClient u; 
    public IPEndPoint e; 
} 
関連する問題