首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UDP客户端不发送

UDP客户端不发送
EN

Stack Overflow用户
提问于 2017-11-07 13:38:43
回答 1查看 1.4K关注 0票数 1

我正在为一些我经常使用的设备开发一个自动发现客户端,我遇到了一个问题,对于一些用户来说,UDP包不会被发送出去(它不会出现在Wireshark中)。

它背后的代码相当简单,我认为它在某种程度上与Windows防火墙有关,但到目前为止我还没有找到解决方案。

有人能就下一步要采取的措施提出建议吗?

有关守则:

代码语言:javascript
复制
class AutoDiscovery : IDisposable
{
    private UdpClient Udp;
    private static IPEndPoint BroadcastEP = new IPEndPoint(IPAddress.Broadcast, 12345);
    private List<byte> AutoDiscoverPacket = new List<byte>();

    private bool _IsDisposed = false;
    public bool IsDisposed
    {
        get { return _IsDisposed; }
        private set { _IsDisposed = value; }
    }

    public AutoDiscovery()
    {
        Udp = new UdpClient();
        Udp.ExclusiveAddressUse = false;
        Udp.EnableBroadcast = true;
        Udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
        Udp.Client.Bind(new IPEndPoint(IPAddress.Any, 12345));
        ReceiveDataAsync(ReceiveDataCallback);

        AutoDiscoverPacket.AddRange(new byte[] { 0x14, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x03, 0x00, 0x00 });
        AutoDiscoverPacket.AddRange(Encoding.ASCII.GetBytes("SomeStaticString"));
        while (AutoDiscoverPacket.Count < 123)
        {
            AutoDiscoverPacket.Add(0x00);
        }
    }


    public void Discover()
    {
        if (IsDisposed) { throw new ObjectDisposedException("AutoDiscovery"); }
        Udp.Send(AutoDiscoverPacket.ToArray(), AutoDiscoverPacket.Count, BroadcastEP);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-07 20:12:38

看上去

代码语言:javascript
复制
Udp.Client.Bind(new IPEndPoint(IPAddress.Any, 12345));

允许Windows自行决定绑定到哪个适配器。我能够使用以下代码获取适配器IP地址列表,并创建绑定到每个适配器IP地址的UdpClient。

代码语言:javascript
复制
private List<IPAddress> GetEndpoints()
    {
        List<IPAddress> AddressList = new List<IPAddress>();
        NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces();
        foreach(NetworkInterface I in Interfaces)
        {
            if ((I.NetworkInterfaceType == NetworkInterfaceType.Ethernet || I.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) && I.OperationalStatus == OperationalStatus.Up)
            {
                foreach (var Unicast in I.GetIPProperties().UnicastAddresses)
                {
                    if (Unicast.Address.AddressFamily == AddressFamily.InterNetwork)
                    {
                        AddressList.Add(Unicast.Address);
                    }
                }
            }
        }
        return AddressList;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47159387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档