1

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

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

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

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

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

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

非常感谢您的帮助

4

2 回答 2

2

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

于 2013-09-12T10:35:02.757 回答
1

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

于 2013-09-13T09:48:56.920 回答