为了账号安全,请及时绑定邮箱和手机立即绑定

在多宿主 Windows 10 机器上接收 UDP 多播消息

在多宿主 Windows 10 机器上接收 UDP 多播消息

C#
30秒到达战场 2021-11-28 20:08:45
我有一个C# .NET客户端,它侦听 UDP 多播消息。我需要在单个网络接口上接收消息。有时我看不到收到的消息。当我禁用其他接口时,它可以工作。我尝试使用本网站上类似问题的代码将套接字选项设置为特定接口,但是,我不确定这是否仅影响发送多播消息而不接收它们?经过我的研究,我发现路由表会导致这种行为,一种解决方案是更改路由表,但我不想走那条路。在所有接口上加入组播组是否更好?我将如何使用UdpClient做到这一点。这是用于设置我的UdpClient的代码:获取接口:public static IEnumerable<NetworkInterface> GetAvailableMulticastInterfaces(){    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();    List<NetworkInterface> availableInterfaces = new List<NetworkInterface>();    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        availableInterfaces.Add(adapter);    }    return availableInterfaces;}设置界面:NetworkInterface networkInterface = Common.Utilities.Network.GetAvailableMulticastInterfaces().Where(nic => nic.Id == attributes.SelectedNetworkInterfaceId).FirstOrDefault();获取接口索引:networkInterfaceIndex  = (int)IPAddress.HostToNetworkOrder(networkInterface.GetIPProperties().GetIPv4Properties().Index);
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

好的,所以我回到这个并找到了正确的操作。必须使用多个接口加入


var availableMulticastNics = Utils.GetAvailableMulticastInterfaces();

var listener = new UdpClient();

listener.Client.Bind(new IPEndPoint(IPAddress.Any, endpoint.Port));


foreach (var ni in availableMulticastNics)

{

    listener.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(multicastEndPoint.Address, ni.GetIPProperties().GetIPv4Properties().Index));

}

// Ready to read socket

而不是listener.JoinMulticastGroup(ni.GetIPProperties().GetIPv4Properties().Index, multicastEndPoint.Address). 否则,我会收到一个 SocketException,它告诉我无效的参数,如果可以的话,有人可以解释一下。


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 246 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信