【发布时间】:2013-09-04 07:00:06
【问题描述】:
假设我想向我的子网中的每个主机发送一条 udp 消息(然后从我的子网中的任何主机接收一条 udp 消息):
我现在这样做:
IPAddress broadcast = IPAddress.Parse("192.168.1.255");
但我当然希望在子网不同于 192.168.1/24 的情况下动态地完成此操作。我试过了:
IPAddress broadcast = IPAddress.Broadcast;
但 IPAddress.Broadcast 代表“255.255.255.255”,不能用于发送消息(它会引发异常)...所以:
如何获取本地网络适配器广播地址(当然也包括网络掩码)?
这是我想出的最终解决方案
public IPAddress getBroadcastIP()
{
IPAddress maskIP = getHostMask();
IPAddress hostIP = getHostIP();
if (maskIP==null || hostIP == null)
return null;
byte[] complementedMaskBytes = new byte[4];
byte[] broadcastIPBytes = new byte[4];
for (int i = 0; i < 4; i++)
{
complementedMaskBytes[i] = (byte) ~ (maskIP.GetAddressBytes().ElementAt(i));
broadcastIPBytes[i] = (byte) ((hostIP.GetAddressBytes().ElementAt(i))|complementedMaskBytes[i]);
}
return new IPAddress(broadcastIPBytes);
}
private IPAddress getHostMask()
{
NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface Interface in Interfaces)
{
IPAddress hostIP = getHostIP();
UnicastIPAddressInformationCollection UnicastIPInfoCol = Interface.GetIPProperties().UnicastAddresses;
foreach (UnicastIPAddressInformation UnicatIPInfo in UnicastIPInfoCol)
{
if (UnicatIPInfo.Address.ToString() == hostIP.ToString())
{
return UnicatIPInfo.IPv4Mask;
}
}
}
return null;
}
private IPAddress getHostIP()
{
foreach (IPAddress ip in (Dns.GetHostEntry(Dns.GetHostName())).AddressList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
return ip;
}
return null;
}
【问题讨论】:
-
您发布的解决方案对我来说效果很好。我没有给 paqogomez 回答,因为你的直接粘贴。想知道您是否应该改变并接受自己的答案?
标签: c# networking udp mask broadcast