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

时间:2013-09-12 10:32:08

标签: c# .net networking web client

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

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

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

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

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

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

非常感谢您的帮助

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

请记住,有类别的广告计划实际上已不再使用了。

以下是this project的示例:

    /// <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的字节数组)