本人一直asp.net web开发,近日要开发一个客户端应用程序。关于客户端的操作不是特别熟悉,菜鸟问题,忘大家不吝赐教。
我写一个客户端应用程序,用户每次登陆客户端,都要在服务器上记录下客户登陆的IP。就好像QQ一样,不是也记录用户的登陆IP么。
代码如下:
private static string getIpAddress()
{
System.Net.IPAddress addr;
addr = new System.Net.IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);
return addr.ToString();
}
这段代码就是从csdn里面搜来的,问题是取出的IP是内网IP,比如我的电脑:192.168.1.2。后来查了查msdn,又把Dns.GetHostByName换成Dns.GetHostEntry ,msdn的理由是GetHostByName过时了。但是结果是一样的,AddressList应该是与本机关联的IP地址数组,但是我只能取出AddressList[0]的值,也就是内网地址,经排查,该数组就一个值。可是我电脑24小时在互联网上,我想取得互联网IP,该如何做呢?
该程序我换了几台电脑,无论是连在adsl猫上的电脑,还是局域网内,AddressList数组都不能取到互联网IP,是什么原因?
本人菜鸟,望详细解释。谢谢
我写一个客户端应用程序,用户每次登陆客户端,都要在服务器上记录下客户登陆的IP。就好像QQ一样,不是也记录用户的登陆IP么。
代码如下:
private static string getIpAddress()
{
System.Net.IPAddress addr;
addr = new System.Net.IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);
return addr.ToString();
}
这段代码就是从csdn里面搜来的,问题是取出的IP是内网IP,比如我的电脑:192.168.1.2。后来查了查msdn,又把Dns.GetHostByName换成Dns.GetHostEntry ,msdn的理由是GetHostByName过时了。但是结果是一样的,AddressList应该是与本机关联的IP地址数组,但是我只能取出AddressList[0]的值,也就是内网地址,经排查,该数组就一个值。可是我电脑24小时在互联网上,我想取得互联网IP,该如何做呢?
该程序我换了几台电脑,无论是连在adsl猫上的电脑,还是局域网内,AddressList数组都不能取到互联网IP,是什么原因?
本人菜鸟,望详细解释。谢谢
iph=Dns.GetHostByName(Dns.GetHostName());
string ipAddr=iph.AddressList[0].ToString();
我是您的老fans了,不过我这个问题是关于客户端开发的,不是web开发。。能不能帮我找找问题的原因to lhfzd2004(风之刀)
iph.AddressList[0].ToString(); 数组里面第一个是内网IP地址重新解释下,我看过有关资料,都说AddressList[1]是存放互联网IP地址的,我想问的是,为什么我的程序只能取出AddressList[0]也就是内网IP地址,然而AddressList[1]却无法得到数值呢?
有哪位高手知道如何获取本地网卡的mac地址,把语句告诉我,我就结贴了。
客户端连接服务端>>>服务端获取客户端公网IP>>记录>>返回客户端>>客户端显示
/// <summary>
/// 获取MAC地址
/// </summary>
/// <returns></returns>
public string GetNetCardMacAddress()
{
ManagementClass mc;
ManagementObjectCollection moc;
mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
moc = mc.GetInstances();
string str = "";
foreach(ManagementObject mo in moc)
{
if((bool)mo["IPEnabled"] == true)
str = mo["MacAddress"].ToString(); }
return str;
}
参考它``
request.getHostName即可
发布后,会显示客户端IP(因为本地DNS的问题,本地测试会是 127.0.0.1)
{
Uri uri = new Uri("http://www.ikaka.com/ip/index.asp");//查本机网络IP的网页
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = 0;
req.CookieContainer = new CookieContainer();
req.GetRequestStream().Write(new byte[0], 0, 0);
HttpWebResponse res = (HttpWebResponse)(req.GetResponse());
StreamReader rs = new StreamReader(res.GetResponseStream(), Encoding.GetEncoding("GB18030"));
string s = rs.ReadToEnd();
rs.Close();
req.Abort();
res.Close();
Match m = Regex.Match(s, @"IP:\[(?<IP>[0-9\.]*)\]");
if (m.Success) return m.Groups["IP"].Value;
string strnetIP = string.Empty;
return strnetIP;
}
通过查本机网络IP的网页找 我就知道这种方法 看你用不用
HttpContext.Current.Request.ServerVariables["Remote_Addr"].ToString()
取得一定是 model的IP
客户端连接服务端>>>服务端获取客户端公网IP>>记录>>返回客户端>>客户端显示
-------------------------
這個思路是對的,因為,你直接獲取本地IP,是獲取不到外網IP的。因為,他要經過路由的轉化才能把本地IP換成外網的IP!所以,只有通過务端获取客户端公网IP!
{
string patt = @"IP: \[(?<IP>[0-9\.]*)\]";
string url = "http://www.sina.com.cn";
return Regex.Match(GetPage(url), patt).Groups["IP"].Value;
}
因為,在internet上 A機,B機要通信,那麼必須知道 A,B的機子在外網上的IP。
但請不要企圖通過
IPHostEntry iph = new IPHostEntry();
iph=Dns.GetHostByName(Dns.GetHostName());
string ipAddr=iph.AddressList[0].ToString();方式獲取到本機的外網IP。
必須是這樣的。
在internet上,有一台有固定IP的服務器,假設是C,如果 A,B之間要通信,那麼,A,B先向C發出UDP請求,那麼C可以根據這個請求可以獲取到A,B的外網IP,如果是路由上網,端口號都能獲取得到。然後,C告訴A,B的外網IP。他們之間就可以通信了。記住,如果A,B是路由上網,一定要用UDP,IP是不行的。當然,如果你沒有服務器C,但想測試這個想法的正確性,你可以把A當成一個服務器,即。
通過QQ知道A的IP外網IP,然後,B能過UDP向A發送請求。
A就根據這個請求,獲取到B的IP。你看看,這時的IP,必然是A的外網IP了。