C#如何在页面中获取本机的外网IP地址
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#如何在页面中获取本机的外网IP地址相关的知识,希望对你有一定的参考价值。
C#如何在网页页面中获取本机的外网IP地址
那用C#如何实现呢?然后用一个Label 或TextBox接收
Request.UserHostAddress获取的是127.0.0.1
我要的是对应外网的IP
那能不能直接得到外网IP
或者通过WebService也行
可以找你的朋友在远程访问你机器上的网页, 他看到的IP一定是他外网的地址。
答复(2008-11-14 23:14:17)
知道你要的是外网的IP。
假设你的机器是web服务器,在我这里访问那个网页,显示的就是我机器的外网IP。在你的机器上访问就是本机IP。
当你写好程序后上传到服务器后,你再访问就是你外网的IP了。
答复(2008-11-17 16:26:27)
楼上给出的地址(http://www.3322.org/dyndns/getip)就挺好的. 可以编写程序获取这个页面. 这个页面中只有一行内容, 那就是你的IP地址. 参考技术A C#在页面中获取本机的外网IP地址:
private static string GetIP()
string tempip = "";
try
WebRequest wr = WebRequest.Create("http://www.ip138.com/ips138.asp");
Stream s = wr.GetResponse().GetResponseStream();
StreamReader sr = new StreamReader(s, Encoding.Default);
string all = sr.ReadToEnd(); //读取网站的数据
int start = all.IndexOf("您的IP地址是:[") + 9;
int end = all.IndexOf("]", start);
tempip = all.Substring(start, end - start);
sr.Close();
s.Close();
catch
return tempip;
参考技术B 一个简单方法可以获取外网IP地址:
lynx -source http://www.3322.org/dyndns/getip
或者
curl http://www.3322.org/dydns/getip
两种方法都可在Windows中使用,但都必须安装相对的软件,即lynxport或curl for Windows。 参考技术C this.Label1.Text = Request.UserHostAddress.ToString();
外网的也还是一样的,因为你现在就是在本地测试啊,要是做好了传到网上就是你外网的IP了
nginx反向代理下thinkphpphp获取不到正确的外网ip
在记录用户发送短信需要获取用户ip时,tp一直获取的是内网ip:10.10.10.10
tp框架获取ip方法:get_client_ip
1 /** 2 * 获取客户端IP地址 3 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 4 * @param boolean $adv 是否进行高级模式获取(有可能被伪装) 5 * @return mixed 6 */ 7 function get_client_ip($type = 0,$adv=false) { 8 $type = $type ? 1 : 0; 9 static $ip = NULL; 10 if ($ip !== NULL) return $ip[$type]; 11 if($adv){ 12 if (isset($_SERVER[\'HTTP_X_FORWARDED_FOR\'])) { 13 $arr = explode(\',\', $_SERVER[\'HTTP_X_FORWARDED_FOR\']); 14 $pos = array_search(\'unknown\',$arr); 15 if(false !== $pos) unset($arr[$pos]); 16 $ip = trim($arr[0]); 17 }elseif (isset($_SERVER[\'HTTP_CLIENT_IP\'])) { 18 $ip = $_SERVER[\'HTTP_CLIENT_IP\']; 19 }elseif (isset($_SERVER[\'REMOTE_ADDR\'])) { 20 $ip = $_SERVER[\'REMOTE_ADDR\']; 21 } 22 }elseif (isset($_SERVER[\'REMOTE_ADDR\'])) { 23 $ip = $_SERVER[\'REMOTE_ADDR\']; 24 } 25 // IP地址合法验证 26 $long = sprintf("%u",ip2long($ip)); 27 $ip = $long ? array($ip, $long) : array(\'0.0.0.0\', 0); 28 return $ip[$type]; 29 }
因一些原因,w项目是在Apache下,后来另外一些项目挤进来使用了nginx,nginx下的项目需要也微信80端口授权,所以使用了反向代理。
经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址
tp框架自带函数获取的是$remote_addr,所以我们没办法获取真实ip。
打开/usr/local/reverse_proxy_nginx/conf/nginx.conf 可以看到如下关键配置
location / { proxy_pass http://backend2; #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
测试
$remoteaddr=$_SERVER["REMOTE_ADDR"]; echo $remoteaddr; echo "---"; $remotehost=$_SERVER["REMOTE_HOST"]; echo $remotehost; echo "---"; $xforwardedfor=$_SERVER["HTTP_X_FORWARDED_FOR"]; echo $xforwardedfor; echo "---"; $xrealip=$_SERVER["HTTP_X_REAL_IP"]; echo $xrealip;
输出
10.10.10.123------181.128.136.191---181.128.136.191
181.128.136.191便是你真实的外网ip,所以只需要获取HTTP_X_FORWARDED_FOR或者HTTP_X_REAL_IP就可以了。
下面是修改后的tp框架函数
ThinkPHP\\Common\\functions.php
1 /* 2 * 访问时用localhost访问的,读出来的是“::1”是正常情况。 3 * ::1说明开启了ipv6支持,这是ipv6下的本地回环地址的表示。 4 * 使用ip地址访问或者关闭ipv6支持都可以不显示这个。 5 */ 6 function get_client_ip() { 7 $ip = "unknown"; 8 if (isset($_SERVER)) { 9 if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { 10 $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 11 } elseif (isset($_SERVER["HTTP_CLIENT_ip"])) { 12 $ip = $_SERVER["HTTP_CLIENT_ip"]; 13 } else { 14 $ip = $_SERVER["REMOTE_ADDR"]; 15 } 16 } else { 17 if (getenv(\'HTTP_X_FORWARDED_FOR\')) { 18 $ip = getenv(\'HTTP_X_FORWARDED_FOR\'); 19 } elseif (getenv(\'HTTP_CLIENT_ip\')) { 20 $ip = getenv(\'HTTP_CLIENT_ip\'); 21 } else { 22 $ip = getenv(\'REMOTE_ADDR\'); 23 } 24 } 25 if(trim($ip)=="::1"){ 26 $ip="127.0.0.1"; 27 } 28 return $ip; 29 }
Apache下的tp项目,再调用get_client_ip函数就可正常获取外网ip了
以上是关于C#如何在页面中获取本机的外网IP地址的主要内容,如果未能解决你的问题,请参考以下文章