【问题标题】:How do you get host's broadcast address of the default network adapter? C#您如何获取默认网络适配器的主机广播地址? C#
【发布时间】: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


【解决方案1】:

如果得到本地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);
            }
        }
    }
}

How to calculate the IP range when the IP address and the netmask is given?应该给你剩下的。

【讨论】:

  • 很好,有了你的回答,我几乎达到了我的目标,最后一个问题:现在我可以枚举每个接口的所有网络掩码。如何获得本地 LAN 网络之一 - 如果有的话! (电脑可以直接联网)
  • 查看我的编辑。 if (Interface.OperationalStatus != OperationalStatus.Up) continue; 在这之间,以及其他非常有趣的参数与NetworkInterface 你应该有它。
  • 我添加了一小段代码,让我得到正确的掩码,删除了您的代码的某些部分(带有 continue; 指令的部分)。基本上,我从 Dns 对象获取主机当前 IP,然后将其与每个 UnicastIPAddressInformationCollection ip 进行比较。当我找到匹配项时,我返回相关的网络掩码。这似乎有效。当然,我把你的作为解决方案,因为你的帮助是找到解决方案的基础。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2014-09-04
相关资源
最近更新 更多