要接收UDP广播,请尝试将创建与绑定分离。例如,
var myUDP = new UdpClient()
{
ExclusiveAddressUse = false,
EnableBroadcast = true
};
IPEndPoint localIPEndPoint = new IPEndPoint(myIP.BroadcastIPAddress, 8888);
myUDP.Client.Bind(localIPEndPoint);
根据我的经验,短格式构造函数,如UdpClient(8888),绑定底层套接字的时间似乎太早了。这将阻止更改EnableBroadcast属性。
public class BroadcastAddress
{
public IPAddress IPAddress { get; set; }
public IPAddress BroadcastIPAddress { get; set; }
public NetworkInterfaceType NetworkInterfaceType { get; set; }
}
public static IEnumerable<BroadcastAddress> GetBroadcastAddresses()
{
List<BroadcastAddress> broadcastAddresses = new List<BroadcastAddress>();
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface networkInterface in networkInterfaces)
{
if (networkInterface != null
&& (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211
|| networkInterface.NetworkInterfaceType == NetworkInterfaceType.Ethernet))
{
IPInterfaceProperties iPInterfaceProperties = networkInterface.GetIPProperties();
UnicastIPAddressInformationCollection unicastIPAddressInformationCollection = iPInterfaceProperties.UnicastAddresses;
foreach (UnicastIPAddressInformation unicastIPAddressInformation in unicastIPAddressInformationCollection)
{
if (unicastIPAddressInformation.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
IPAddress broadcastIPAddress =
new IPAddress(unicastIPAddressInformation.Address.Address | (UInt32.MaxValue ^ (UInt32)(unicastIPAddressInformation.IPv4Mask.Address)));
broadcastAddresses.Add(new BroadcastAddress()
{
IPAddress = unicastIPAddressInformation.Address,
BroadcastIPAddress = broadcastIPAddress,
NetworkInterfaceType = networkInterface.NetworkInterfaceType
});
}
}
}
}
return broadcastAddresses;
}
在处理移动设备时,只需使用Wireless802 1广播地址。在笔记本电脑或工作站上,可能会变得稍微复杂一些。这些设备可以在每个接口上有多个网络接口和多个子网。因此,返回列表的原因。而且,这意味着您可能需要有多个UdpClient实例,每个子网一个。
这对操作来说可能太晚了。希望这些信息能帮助其他一些疲惫不堪的搜索者尝试让广播正常工作(并且他们可以停止在桌子上敲打自己的前额)。