本人一直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,是什么原因?
本人菜鸟,望详细解释。谢谢

解决方案 »

  1.   

    请使用 Request.UserHostAddress属性,可以得到客户端上网的IP地址,不是本机地址,一般是得不到的。要得到客户端本机地址,需要activex
      

  2.   

    IPHostEntry iph = new IPHostEntry();   
    iph=Dns.GetHostByName(Dns.GetHostName());  
    string ipAddr=iph.AddressList[0].ToString();
      

  3.   

    to 孟子e章
    我是您的老fans了,不过我这个问题是关于客户端开发的,不是web开发。。能不能帮我找找问题的原因to lhfzd2004(风之刀) 
    iph.AddressList[0].ToString(); 数组里面第一个是内网IP地址重新解释下,我看过有关资料,都说AddressList[1]是存放互联网IP地址的,我想问的是,为什么我的程序只能取出AddressList[0]也就是内网IP地址,然而AddressList[1]却无法得到数值呢?
      

  4.   

    System.Net.IPHostEntry IPINT = new System.Net.IPHostEntry();
      

  5.   

    u can not find client ip when your computer in intranet.
      

  6.   

    请问,为什么在intarnet中,无法获得我的网卡当前的internet IP地址呢?我原理不是特别清楚。换句话说,QQ也是cs架构的应用程序,为什么QQ就可以取得我当前的外网IP呢?
      

  7.   

    这个问题没人能解答么?
    有哪位高手知道如何获取本地网卡的mac地址,把语句告诉我,我就结贴了。
      

  8.   

    提供个思路:
    客户端连接服务端>>>服务端获取客户端公网IP>>记录>>返回客户端>>客户端显示
      

  9.   

    using System.Management;
    /// <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;
    }
      

  10.   

    http://topic.csdn.net/t/20061229/17/5264965.html#
    参考它``
      

  11.   

    正常情况下你能获取的本地地址就是你tcp/ip协议的地址,当你在内部网中,你的地址是192.x.x.x,你访问外网时如果是adsl直连,那么你有一个虚拟拨号的网卡和对应外部IP,但是如果你通过路由器出去你的地址就是1x.x.x.
      

  12.   

    使用
    request.getHostName即可
    发布后,会显示客户端IP(因为本地DNS的问题,本地测试会是 127.0.0.1)
      

  13.   

    static string netIP()
            {
                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的网页找  我就知道这种方法 看你用不用
      

  14.   

    如果客户端是IE就用这个吧
    HttpContext.Current.Request.ServerVariables["Remote_Addr"].ToString()
    取得一定是 model的IP
      

  15.   

    SELECT * FROM Win32_NetworkAdapter 不知道里面有没有~~~   
      

  16.   

    提供个思路:
    客户端连接服务端>>>服务端获取客户端公网IP>>记录>>返回客户端>>客户端显示
    -------------------------
    這個思路是對的,因為,你直接獲取本地IP,是獲取不到外網IP的。因為,他要經過路由的轉化才能把本地IP換成外網的IP!所以,只有通過务端获取客户端公网IP!
      

  17.   

    static   string   GetOuterIP()   
      {   
      string   patt   =   @"IP:   \[(?<IP>[0-9\.]*)\]";   
      string   url     =   "http://www.sina.com.cn";
      return   Regex.Match(GetPage(url),   patt).Groups["IP"].Value;   
      }   
      

  18.   

    我曾經試著做個像QQ一樣的東東,也是面臨這個問題的。
    因為,在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了。