从 .NET HttpRequest 类检索子网掩码地址

本文关键字:子网掩码 地址 检索 NET HttpRequest | 更新日期: 2023-09-27 18:30:59

从类System.Web.HttpRequest给出一个对象实例,比如myRequest,然后使用属性System.Web.HttpRequest.UserHostAddress我可以检索远程客户端的 IP 地址:

string myIp = myRequest.UserHostAddress;
(...)

我需要的是仅从实例myRequest检索远程客户端子网掩码的 IP 地址。

我知道以下内容是不可能的,但我想完成类似的事情:

string myMaskIp = myRequest.UserHostMaskAddress;
(...)

这是因为我无法像使用命名空间那样检查本地设备网络接口System.Net.NetworkInformation因此我唯一可用的探测对象是从远程客户端到服务器的 http 请求。

非常感谢您的帮助

从 .NET HttpRequest 类检索子网掩码地址

我很确定您无法通过简单地向远程主机发出请求来确定子网掩码 - 即使远程主机是您。

Oldyis 适用于一般情况,但是可以从 IPv4 地址确定有类子网掩码。没有任何进一步的信息,确定无类别子网掩码确实是不可能的。

请记住,分类地址方案实际上不再使用。

以下是该项目的示例:

    /// <summary>
    /// Returns the classfull subnet mask of a given IPv4 network
    /// </summary>
    /// <param name="ipa">The network to get the classfull subnetmask for</param>
    /// <returns>The classfull subnet mask of a given IPv4 network</returns>
    public static Subnetmask GetClassfullSubnetMask(IPAddress ipa)
    {
        if (ipa.AddressFamily != AddressFamily.InterNetwork)
        {
            throw new ArgumentException("Only IPv4 addresses are supported for classfull address calculations.");
        }
        IPv4AddressClass ipv4Class = GetClass(ipa);
        Subnetmask sm = new Subnetmask();
        if (ipv4Class == IPv4AddressClass.A)
        {
            sm.MaskBytes[0] = 255;
        }
        if (ipv4Class == IPv4AddressClass.B)
        {
            sm.MaskBytes[0] = 255;
            sm.MaskBytes[1] = 255;
        }
        if (ipv4Class == IPv4AddressClass.C)
        {
            sm.MaskBytes[0] = 255;
            sm.MaskBytes[1] = 255;
            sm.MaskBytes[2] = 255;
        }
        return sm;
    }

(将 SubnetMask 类视为长度为 4 的字节数组)