我正在为一些我经常使用的设备开发一个自动发现客户端,我遇到了一个问题,对于一些用户来说,UDP包不会被发送出去(它不会出现在Wireshark中)。
它背后的代码相当简单,我认为它在某种程度上与Windows防火墙有关,但到目前为止我还没有找到解决方案。
有人能就下一步要采取的措施提出建议吗?
有关守则:
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);
}
}发布于 2017-11-07 20:12:38
看上去
Udp.Client.Bind(new IPEndPoint(IPAddress.Any, 12345));允许Windows自行决定绑定到哪个适配器。我能够使用以下代码获取适配器IP地址列表,并创建绑定到每个适配器IP地址的UdpClient。
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;
}https://stackoverflow.com/questions/47159387
复制相似问题