2009-04-20 17 views
9

ローカルネットワーク上で簡単なUDP通信をしようとしています。C#でローカルネットワーク上でUDPマルチキャストを実行するには?

私がやりたいすべては、それが動作する

public void Start() 
    { 
     udpClient = new UdpClient(8088); 
     udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50); 

     receiveThread = new Thread(Receive); 
     receiveThread.Start(); 
    } 

    public void Receive() 
    { 
     while (true) 
     { 
      var ipEndPoint = new IPEndPoint(IPAddress.Any, 0); 
      var data = udpClient.Receive(ref ipEndPoint); 

      Message = Encoding.Default.GetString(data); 

      // Raise the AfterReceive event 
      if (AfterReceive != null) 
      { 
       AfterReceive(this, new EventArgs()); 
      } 
     } 
    } 

ネットワークここ

私が送信しているコードここ

public void SendMessage(string message) 
    { 
     var data = Encoding.Default.GetBytes(message); 
     using (var udpClient = new UdpClient(AddressFamily.InterNetwork)) 
     { 
      var address = IPAddress.Parse("224.100.0.1"); 
      var ipEndPoint = new IPEndPoint(address, 8088); 
      udpClient.JoinMulticastGroup(address); 
      udpClient.Send(data, data.Length, ipEndPoint); 
      udpClient.Close(); 
     } 
    } 

と上のすべてのマシンへのマルチキャストを行う私の受信コードされています私のローカルマシンでは完全には動作しますが、ネットワーク経由では動作しません。

- ファイアウォールのようではありません。私は両方のマシンでそれを無効にし、それでも動作しませんでした。

- クライアントマシンのハードコードされたIPアドレス(つまりマルチキャストではない)に直接送信すると機能します。

ご協力いただければ幸いです。

答えて

7

ローカルネットワークハードウェアはIGMPをサポートしていますか?

スイッチがマルチキャスト対応である可能性もありますが、IGMPが無効の場合、接続されているハードウェアが特定のマルチキャストグループに加入しているため通知されません。

これをテストするには、2台のマシンをクロスオーバーケーブルで直接接続します。それは(AFAICR)は常に動作するはずです。

サーバークライアントの半分ではなく、JoinMulticastGroup()にTTL引き数を指定したコードの半分を指定する必要があります。

0

コードのどこにでもTTLが指定されていません。 TTLはもともと単位秒であることを意図していたが、単位ホップとなっていることを忘れないでください。つまり、巧妙なTTLを使用することで、ルータを通過する必要がなくなります。私のマシンのデフォルトのTTLは32です - それ以上のものでなければならないと思います。お使いのシステムがセキュリティロックダウンのいずれかのフォームを使用している場合は、実際には異なることがあります(UdpClient.Ttl)。

私は個人的に多くの実験を行う必要があるので、必要なTTLをお勧めできません。

問題が解決しない場合、あなたはこれらの記事を見ている可能性があり:オール・イン・すべての成功があったように見える

ソケットを使用し、UdpClientsは使用しません。

選択したマルチキャストグループは、ローカルのみにすることもできます。 Try another one.

物理ネットワーク層によって問題が発生している可能性もあります。私はスイッチと直接(x-over)接続に疑問を抱くことに挑戦します。ハブともっと知的な人たちは、それらをうまく処理する必要があります。しかし私はそれを裏付ける文学はない。

1

私は似たような(と思う)に4時間を費やしてきた、私のためのソリューションでした:

client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT)); 
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First()); 
client.MulticastLoopback = true; 

マルチキャストグループ上の特定の(最初の外部)IPアドレスを使用します。

+0

LAN上で動作させるのに問題がありました。 JoinMulticastGroup()を呼び出すときにリッスンする明示的なIPアドレスの2番目の引数がなければ、Docker/Hyper-Vの一部としてインストールした仮想イーサネットドライバを実際にイーサネットではなくマルチキャストグループに参加させるだけでしたアダプタ。複数のネットワークアダプタを使用している場合は、IPアドレスを2番目の引数として使用するメソッドオーバーロードで明示的にマルチキャストグループに参加するIPアドレスを指定する必要があります。 – MEverett

関連する問題