您好我的PC上有2个Networkadapter,并希望将Udp多播发送到所选网络接口上的239.0.0.222端口9050。 但它只适用于第一个接口,当选择另一个NIC时,不会发送任何数据。
localIP是所选适配器的本地IP
发件人代码:
IPAddress localIP = getLocalIpAddress();
IPAddress multicastaddress = IPAddress.Parse("239.0.0.222");
IPEndPoint remoteep = new IPEndPoint(multicastaddress, 9050);
UdpClient udpclient = new UdpClient(9050);
MulticastOption mcastOpt = new MulticastOption(multicastaddress,localIP);
udpclient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, mcastOpt);
udpclient.Send(data, data.Length, remoteep);
EDIT1:
适配器本地IP的代码:
NetworkInterface.GetAllNetworkInterfaces()[adapterIndex].GetIPProperties().UnicastAddresses[0].Address;
EDIT2,5:
也试过两个相同的reuslt
Wireshark在第二个适配器上显示组播组的正确连接
udpclient.JoinMulticastGroup(multicastaddress);
udpclient.Client.Bind(remoteep);
EDIT3:
我现在尝试在另一台PC上,但同样的问题再次发生,Adapter1运行,其他所有都没有发送
我试过的另一件事是在windows xp config中切换前两个适配器的顺序,然后新的第一个适配器工作,但新的第二个适配器什么都不发送。
答案 0 :(得分:1)
我认为这个人有答案,你必须遍历网络接口并找到支持多播的接口。
http://windowsasusual.blogspot.ru/2013/01/socket-option-multicast-interface.html
答案 1 :(得分:1)
默认情况下,只有第一个适配器加入给定的多播组。从操作系统的角度来看,它绝对相关,因为无论适配器使用多播流,该组都将提供相同的内容。如果您计划在每个适配器上侦听多播,则必须对它们进行迭代并在每个适配器上放置相应的套接字选项:
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in nics)
{
IPInterfaceProperties ip_properties = adapter.GetIPProperties();
if (!adapter.GetIPProperties().MulticastAddresses.Any())
continue; // most of VPN adapters will be skipped
if (!adapter.SupportsMulticast)
continue; // multicast is meaningless for this type of connection
if (OperationalStatus.Up != adapter.OperationalStatus)
continue; // this adapter is off or not connected
IPv4InterfaceProperties p = adapter.GetIPProperties().GetIPv4Properties();
if (null == p)
continue; // IPv4 is not configured on this adapter
my_sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(p.Index));
}
P.S。是的,我' m"这家伙"上面提到的@lukebuehler为http://windowsasusual.blogspot.ru/2013/01/socket-option-multicast-interface.html