如何获得主机';默认网络适配器的广播地址?C#
假设我想向子网中的每台主机发送udp消息(然后从子网中的任何主机接收udp消息): 目前我确实:如何获得主机';默认网络适配器的广播地址?C#,c#,networking,udp,mask,broadcast,C#,Networking,Udp,Mask,Broadcast,假设我想向子网中的每台主机发送udp消息(然后从子网中的任何主机接收udp消息): 目前我确实: IPAddress broadcast = IPAddress.Parse("192.168.1.255"); 但我当然希望在子网与192.168.1/24不同的情况下,以友好的方式执行此操作。我试过: IPAddress broadcast = IPAddress.Broadcast; 但是IPAddress.Broadcast表示“255.255.255.255”,不能用于发送消息(它引发异
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;
}
公共IP地址getBroadcastIP()
{
IPAddress maskIP=getHostMask();
IPAddress hostIP=getHostIP();
if(maskIP==null | | hostIP==null)
返回null;
byte[]complementedMaskBytes=新字节[4];
字节[]IPBytes=新字节[4];
对于(int i=0;i<4;i++)
{
complementedMaskBytes[i]=(byte)~(maskIP.GetAddressBytes().ElementAt(i));
broadcastIPBytes[i]=(byte)((hostIP.GetAddressBytes().ElementAt(i))|互补的maskbytes[i]);
}
返回新的IPAddress(广播IPBytes);
}
专用IPAddress getHostMask()
{
NetworkInterface[]Interfaces=NetworkInterface.GetAllNetworkInterfaces();
foreach(接口中的网络接口)
{
IPAddress hostIP=getHostIP();
UnicastipAddressInformation集合UnicastIPInfoCol=Interface.GetIPProperties().UnicastAddresses;
foreach(UnicastIPAddressInformation UnicastipInfo在UnicastipInfo中)
{
if(UnicatIPInfo.Address.ToString()==hostIP.ToString())
{
返回UnicatIPInfo.IPv4Mask;
}
}
}
返回null;
}
私有IP地址getHostIP()
{
foreach(ip地址位于(Dns.GetHostEntry(Dns.GetHostName())).AddressList)
{
if(ip.AddressFamily==AddressFamily.InterNetwork)
返回ip;
}
返回null;
}
如果您得到本地IP和子网,那么计算应该没有问题 也许是这样的
using System;
using System.Net.NetworkInformation;
public class test
{
public static void Main()
{
NetworkInterface[] Interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach(NetworkInterface Interface in Interfaces)
{
if(Interface.NetworkInterfaceType == NetworkInterfaceType.Loopback) continue;
if (Interface.OperationalStatus != OperationalStatus.Up) continue;
Console.WriteLine(Interface.Description);
UnicastIPAddressInformationCollection UnicastIPInfoCol = Interface.GetIPProperties().UnicastAddresses;
foreach(UnicastIPAddressInformation UnicatIPInfo in UnicastIPInfoCol)
{
Console.WriteLine("\tIP Address is {0}", UnicatIPInfo.Address);
Console.WriteLine("\tSubnet Mask is {0}", UnicatIPInfo.IPv4Mask);
}
}
}
}
应该给你剩下的。很好,你的回答让我几乎达到了我的目标,最后一个问题:现在我可以列举每个接口的所有网络掩码。如何获得一个本地局域网-如果有的话!(计算机可能直接连接到internet)查看我的编辑<代码>如果(Interface.OperationalStatus!=OperationalStatus.Up)继续我添加了一小段代码,让我获得了正确的掩码,删除了代码的一些部分(带有continue;指令的部分)。基本上,我从Dns对象获取主机当前IP,然后将其与每个UnicastipAddressInformation集合IP进行比较。找到匹配项后,返回关联的网络掩码。这似乎奏效了。当然,我把你的作为解决方案,因为你的帮助是找到解决方案的基础。你发布的解决方案对我很有效。我没有给帕库戈麦斯答案,因为你的答案是直接粘贴的。想知道你是否应该改变并接受自己的答案?