Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得主机';默认网络适配器的广播地址?C#_C#_Networking_Udp_Mask_Broadcast - Fatal编程技术网

如何获得主机';默认网络适配器的广播地址?C#

如何获得主机';默认网络适配器的广播地址?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”,不能用于发送消息(它引发异

假设我想向子网中的每台主机发送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;
}
公共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)继续