はじめに
とあるソフトがマルチキャストで送信する信号を同一のホストで受信解析する仕組みが欲しく、
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 既に使用されているアドレスにソケットをバインドすることを許可します。