1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[C#] メモtip:UDPマルチキャストを受信する(送受信同一ホスト対応)

Posted at

はじめに

とあるソフトがマルチキャストで送信する信号を同一のホストで受信解析する仕組みが欲しく、
UDPClientの使い方を調べるもどうにもローカルホストを考慮したサンプルが見つからず、
ようやく見つけたのでメモ。

結論

以下のように書けばよい。


public static void Main(string[] args)
        {
           
            UdpClient client = new UdpClient();
            client.ExclusiveAddressUse = false;
            client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            IPEndPoint localEp = new IPEndPoint(IPAddress.Any, 5568);
            client.Client.Bind(localEp);
            client.JoinMulticastGroup(IPAddress.Parse("239.255.0.1"), IPAddress.Any);
            client.JoinMulticastGroup(IPAddress.Parse("239.255.0.2"), IPAddress.Any);
            
            while (true)
            {
                try
                {
                    byte[] data = client.Receive(ref localEp);
                    string text = Encoding.ASCII.GetString(data);
                    Console.WriteLine(localEp.Address);
                }
                catch (Exception e)
                {
                    
                }
            }
        }

プチ解説

ローカルで回すことなんて考慮されてないのかMSのドキュメント(Multicast)にはぱっと見存在しない以下の2行が大事

client.ExclusiveAddressUse = false;
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

ExclusiveAddressUse

以下ドキュメント引用

Socket で 1 つのプロセスだけにポートのバインドを許可するかどうかを指定する Boolean 値を取得または設定します。

SocketOptionName.ReuseAddress

以下ドキュメント引用

SocketOptionName.ReuseAddress 既に使用されているアドレスにソケットをバインドすることを許可します。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?