用php来获得客户端服务器ip的方法

用php来获得客户端服务器ip的方法,第1张

 <php

 echo "当前脚本服务器的主机名 " gethostbyaddr($_SERVER[ REMOTE_ADDR ]) "<br /><hr />"; echo "获得当前运行PHP脚本(页面)所在的服务器的 IP 地址:" $_SERVER[ SERVER_ADDR ] "<br /><hr />"; echo "获得当前运行PHP脚本(页面)所在的服务器的 主机名:" $_SERVER[ SERVER_NAME ]; echo <hr> ; echo 客户端ip $_SERVER[ REMOTE_ADDR ]; echo <br> ; echo 客户端ip getenv( REMOTE_ADDR ); echo "<br>"; echo 服务器主机ip gethostbyname(" qq "); >

lishixinzhi/Article/program/PHP/201311/20917

客户机获取DHCP服务器主要分为4个步骤:

1IP租用请求:

DHCP客户机初始化TCP/IP,通过UDP端口67向网络中发送一个DHCPDISCOVER广播包,请求租用IP地址。该广播包中的源IP地址为0000,目标IP地址为255255255255;包中还包含客户机的MAC地址和计算机名。

2IP租用提供:

任何接收到DHCPDISCOVER广播包并且能够提供IP地址的DHCP服务器,都会通过UDP端口68给客户机回应一个DHCPOFFER广播包,提供一个IP地址。该广播包的源IP地址为DCHP服务器IP,目标IP地址为255255255255;包中还包含提供的IP地址、子网掩码及租期等信息。

3IP租用选择:

客户机从不止一台DHCP服务器接收到提供之后,会选择第一个收到的DHCPOFFER包,并向网络中广播一个DHCPREQUEST消息包,表明自己已经接受了一个DHCP服务器提供的IP地址。该广播包中包含所接受的IP地址和服务器的IP地址。

所有其他的DHCP服务器撤消它们的提供以便将IP地址提供给下一次IP租用请求。

4IP租用确认:

被客户机选择的DHCP服务器在收DHCPREQUEST广播后,会广播返回给客户机一个DHCPACK消息包,表明已经接受客户机的选择,并将这一IP地址的合法租用以及其他的配置信息都放入该广播包发给客户机。

客户机在收到DHCPACK包,会使用该广播包中的信息来配置自己的TCP/IP,则租用过程完成,客户机可以在网络中通信。

DHCP客户机在发出IP租用请求的DHCPDISCOVER广播包后,将花费1秒钟的时间等待DHCP服务器的回应,如果1秒钟没有服务器的回应,它会将这一广播包重新广播四次(以2,4,8和16秒为间隔,加上1~1000毫秒之间随机长度的时间)。四次之后,如果仍未能收到服务器的回应,则运行Windows 2000的DHCP客户机将从16925400/16这个自动保留的私有IP地址(APIPA)中选用一个IP地址,而运行其他操作系统的DHCP客户机将无法获得IP地址。DHCP客户机仍然每隔5分钟重新广播一次,如果收到某个服务器的回应,则继续IP租用过程。

IPHostEntry ipe = DnsGetHostEntry(DnsGetHostName()); 

            IPAddress ipa = ipeAddressList[1];

labelText = ipaTostring();//看看是不是你想要的

#region 获取web客户端ip

        /// <summary>

        /// 获取web客户端ip

        /// </summary>

        /// <returns></returns>

        public static string GetWebClientIp()

        {

         

                string userIP = "未获取用户IP";

                try

                {

                    if (SystemWebHttpContextCurrent == null

                || SystemWebHttpContextCurrentRequest == null

                || SystemWebHttpContextCurrentRequestServerVariables == null)

                        return "";

                    string CustomerIP = "";

                    //CDN加速后取到的IP simone 090805

                    CustomerIP = SystemWebHttpContextCurrentRequestHeaders["Cdn-Src-Ip"];

                    if (!stringIsNullOrEmpty(CustomerIP))

                    {

                        return CustomerIP;

                    }

                    CustomerIP = SystemWebHttpContextCurrentRequestServerVariables["HTTP_X_FORWARDED_FOR"];

                   

                    if (!StringIsNullOrEmpty(CustomerIP))

                        return CustomerIP;

                    if (SystemWebHttpContextCurrentRequestServerVariables["HTTP_VIA"] != null)

                    {

                        CustomerIP = SystemWebHttpContextCurrentRequestServerVariables["HTTP_X_FORWARDED_FOR"];

                        if (CustomerIP == null)

                            CustomerIP = SystemWebHttpContextCurrentRequestServerVariables["REMOTE_ADDR"];

                    }

                    else

                    {

                        CustomerIP = SystemWebHttpContextCurrentRequestServerVariables["REMOTE_ADDR"];

                    }

                    if (stringCompare(CustomerIP, "unknown", true) == 0)

                        return SystemWebHttpContextCurrentRequestUserHostAddress;

                    return CustomerIP;

                }

                catch { }

                return userIP;

           

        }

        #endregion

您好,XXXXXXX系列IP,而这个函数获取的是局域网网关出口的IP地址,如果访问者使用代理服务器,将不获取代理服务器的IP,而是获取访问者网关的真实IP。如果将这个函数应用到限IP访问的网页中,别人即使通过限IP访问段中的代理服务器,也不能访问该页面。

下面提供一个函数:<php

// 定义一个函数getIP()

function getIP(){global $ip;

if (getenv("HTTP_CLIENT_IP"))

$ip = getenv("HTTP_CLIENT_IP");

else if(getenv("HTTP_X_FORWARDED_FOR"))

$ip = getenv("HTTP_X_FORWARDED_FOR");

else if(getenv("REMOTE_ADDR"))

$ip = getenv("REMOTE_ADDR");else$ip = "Unknow";

return $ip;}

// 使用方法:

echo getIP();>

getenv("REMOTE_ADDR")用来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 来读取。

但是如果客户端没有通过代理服务器来访问,那么用getenv("HTTP_X_FORWARDED_FOR") 取到的值将是空的。

else if(getenv("HTTP_X_FORWARDED_FOR"))

$ip = getenv("HTTP_X_FORWARDED_FOR");

表示如果getenv("HTTP_X_FORWARDED_FOR") 取到的值存在不为空(即客户端使用代理服务器的情况下),则变量$ip等于getenv("HTTP_X_FORWARDED_FOR") 取到的真实IP值。

如果上面的else if(getenv("HTTP_X_FORWARDED_FOR"))取得的值为空(即没有使用代理服务器),则不会执行下面的$ip = getenv("HTTP_X_FORWARDED_FOR");这一行语句。

这种情况下已经确认客户端没有使用代理服务器,从而通过

else if(getenv("REMOTE_ADDR"))

这两行语句获得客户端的IP地址也是真实的IP地址。

在JSP里,获取客户端的IP地址的方法是:requestgetRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了 Apache,Nagix等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用 requestgetRemoteAddr()方法获取的IP地址是:127001或 1921681110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端 IP地址和原来客户端请求的服务器地址。

举例来说,当我们访问口碑网首页hangzhoujsp时,其实并不是我们浏览器真正访问到了服务器上的hangzhoujsp 文件,而是先由代理服务器Nagix去访问hagnzhoujsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问hangzhoujsp的,所以hangzhoujsp中通过 requestgetRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

<hr/>

获得客户端真实IP地址的方法一:

public String getRemortIP(HttpServletRequest request) {

if (requestgetHeader("x-forwarded-for") == null) {

return requestgetRemoteAddr();

}

return requestgetHeader("x-forwarded-for");

}

<hr/>

获得客户端真实IP地址的方法二

public String getIpAddr(HttpServletRequest request) {

String ip = requestgetHeader("x-forwarded-for");

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetHeader("Proxy-Client-IP");

}

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetHeader("WL-Proxy-Client-IP");

}

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetRemoteAddr();

}

return ip;

}

<hr/>

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 用php来获得客户端服务器ip的方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情