假设有 N 个的客户端应用程序,分别在内网、外网应用。但是在应用程序中,连接服务器的IP地址,在客户端是如何区分,要连接的是内网服务器IP还是外网服务器IP?假设内网IP:192.168.1.99、外网则:218.85.85.85现在想到2个办法,但都感觉不“好”。
1、尝试 Open 内网的 SQL SERVER Connection,通过则为内网。
2、加一个下拉框给客户。但体验感不好。

解决方案 »

  1.   

    内网,是不是限在与你同一个局域网中的?除此之外都可以认为是外网吧?这个倒好说,你的IP与子网掩码,与运算,它的IP与子网掩码,与运算,如果得到的结果相同就是在同一个网络内。
      

  2.   


    是的。所有的内网用户都是:192.168.1.XX
    但是,如果外网用户,他们拥有自己的局域网,也有 192.168.1.XX 呢?
    不知道您指的的“运算”,是什么,希望不吝赐教。
      

  3.   

    当然,看它的IP是不是内网专用IP也是一个方法。
      

  4.   

    是的。所有的内网用户都是:192.168.1.XX但是,如果外网用户,他们拥有自己的局域网,也有 192.168.1.XX 呢?
    不知道您指的的“运算”,是什么,希望不吝赐教。如果别人也是在局域网内,你是无法直接访问的,即使能够访问,也只能是通过它的外网IP,这一点是不需要考虑的。我说的是“与运算”,二进制与运算。
      

  5.   


    不不不,您误会我的意思了。我的意思是:外网连接外网IP,内网连接内网IP。但是,如何判断要连接的是内网还是外网。
      

  6.   

    要不,你还是换另一种方法吧内网专用IP大概如下:10.x.x.x172.16.x.x--172.31.x.x192.168.x.x
      

  7.   

    你的服务器也有内网ip吧 ?
    ping一下不就可以了吗? 
      

  8.   

    假设内网IP:192.168.1.99、外网则:218.85.85.85内网客户端应该可以ping 192.168.1.99
    而外网客户端是访问不到 192.168.1.99的
      

  9.   

    如何判断这个根据你的IP来啊获取当前的IP 本机的IP如果是192.168段的是内网
    其他的你用外网
      

  10.   

    这么说吧:你这边使用的IP为192.168.1.133,不过你要能连接外网的话,必然有一个网关,网关有一个外网IP,假设为218.85.85.85,对方使用的IP为192.168.1.134,对方网关IP为218.85.85.86。你觉得,你访问对方使用哪个IP?192.168.1.134?还是218.85.85.86?第二种情况:你这边照旧,对方的服务器就是网关,即218.85.85.86。这两种情况,对你来说是没有区别的,对方如果在局域网内,要想外网能够访问的话,那是对方网络管理员操心的事儿,只要你能访问,对你来说就是没有区别的,而且你也无法区别。
      

  11.   


    你的意思是说,比较 2 个外网 IP 是否一致?如果不一致就使用外网?如果一致就使用内网?这样的策略有想过,但是获取外网IP,似乎要通过“第三方”(如查询公网IP的网站)来获取自己的ip地址。
      

  12.   

    哎,,你既然说客户端,,那么你应该有服务端吧,,
    每次让他请求你的服务端,,,然后你的服务端根据请求IP   是 192.168.1 开头的 就给他返回特征码 告诉他是局域网的,,如果不是 就返回是外网的,,,只要你别用穿透代理的方法去获取IP  那就不会得到他的深层IP   这样就OK了,,,
      

  13.   

    192.168.1  因为他和你如果是同一个局域网  并且你们的IP 都是192.168.1.XX
    那他访问你   你获得的必然是 192.168.1.XX  除非你本机 是 127.0.0.1这样你就可以判断出来是不是和你同一个局域网了
      

  14.   

    如果你主动连接,不需要你的外网IP。而且,如果双方一个是外网IP,一个是内网IP,已经可以确定不是同一个局域网了。
      

  15.   

    楼主可以使用p2p技术解决。
    http://zhidao.baidu.com/question/41083580.html?fr=ala0
      

  16.   

    http://baike.baidu.com/view/878.htm#6_1
      

  17.   

    A类IP默认子网掩码:255.0.0.0
    B类IP默认子网掩码:255.255.0.0
    C类IP默认子网掩码:255.255.255.0
      

  18.   

    这个问题其实应该脱离编程来考虑,应该是在DNS上考虑解决方法.比如说,你公司的域名是 abc.com, 一般来说,网管都会设置在内网中,访问 abc.com 得到的IP为 192.168.X.X 这样的内网IP, 但对外网访问, 则得到的IP为公网IP,如 218.X.X.X所以你要做的就是让网管架设一个内部DNS服务器,设置好解析,在你的程序中通过这个域名去取IP地址,
    这样你的程序就可以自动得到正确的连接IP了.
      

  19.   


    using System;
    using System.IO;
    using System.Collections;
    using System.Text;
    using System.Text.RegularExpressions;
    public class IPScanner
    {
        #region 私有成员
        private string dataPath;
        private string ip;
        private string country;
        private string local;    private long firstStartIp = 0;
        private long lastStartIp = 0;
        private FileStream objfs = null;
        private long startIp = 0;
        private long endIp = 0;
        private int countryFlag = 0;
        private long endIpOff = 0;
        private string errMsg = null;
        #endregion    #region 构造函数
        public IPScanner()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
        #endregion    #region 公共属性
        public string DataPath
        {
            set { dataPath = value; }
        }
        public string IP
        {
            set { ip = value; }
        }
        public string Country
        {
            get { return country; }
        }
        public string Local
        {
            get { return local; }
        }
        public string ErrMsg
        {
            get { return errMsg; }
        }
        #endregion    #region 搜索匹配数据
        private int QQwry()
        {
            string pattern = @"(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))";
            Regex objRe = new Regex(pattern);
            Match objMa = objRe.Match(ip);
            if (!objMa.Success)
            {
                this.errMsg = "IP格式错误";
                return 4;
            }        long ip_Int = this.IpToInt(ip);
            int nRet = 0;
            if (ip_Int >= IpToInt("127.0.0.0") && ip_Int <= IpToInt("127.255.255.255"))
            {
                this.country = "本机内部环回地址";
                this.local = "";
                nRet = 1;
            }
            else if ((ip_Int >= IpToInt("0.0.0.0") && ip_Int <= IpToInt("2.255.255.255")) || (ip_Int >= IpToInt("64.0.0.0") && ip_Int <= IpToInt("126.255.255.255")) || (ip_Int >= IpToInt("58.0.0.0") && ip_Int <= IpToInt("60.255.255.255")))
            {
                this.country = "网络保留地址";
                this.local = "";
                nRet = 1;
            }
            objfs = new FileStream(this.dataPath, FileMode.Open, FileAccess.Read);
            try
            {
                //objfs.Seek(0,SeekOrigin.Begin);
                objfs.Position = 0;
                byte[] buff = new Byte[8];
                objfs.Read(buff, 0, 8);
                firstStartIp = buff[0] + buff[1] * 256 + buff[2] * 256 * 256 + buff[3] * 256 * 256 * 256;
                lastStartIp = buff[4] * 1 + buff[5] * 256 + buff[6] * 256 * 256 + buff[7] * 256 * 256 * 256;
                long recordCount = Convert.ToInt64((lastStartIp - firstStartIp) / 7.0);
                if (recordCount <= 1)
                {
                    country = "FileDataError";
                    objfs.Close();
                    return 2;
                }
                long rangE = recordCount;
                long rangB = 0;
                long recNO = 0;
                while (rangB < rangE - 1)
                {
                    recNO = (rangE + rangB) / 2;
                    this.GetStartIp(recNO);
                    if (ip_Int == this.startIp)
                    {
                        rangB = recNO;
                        break;
                    }
                    if (ip_Int > this.startIp)
                        rangB = recNO;
                    else
                        rangE = recNO;
                }
                this.GetStartIp(rangB);
                this.GetEndIp();
                if (this.startIp <= ip_Int && this.endIp >= ip_Int)
                {
                    this.GetCountry();
                    this.local = this.local.Replace("(我们一定要解放台湾!!!)", "");
                }
                else
                {
                    nRet = 3;
                    this.country = "未知";
                    this.local = "";
                }
                objfs.Close();
                return nRet;
            }
            catch
            {
                return 1;
            }    }
        #endregion    #region IP地址转换成Int数据
        private long IpToInt(string ip)
        {
            char[] dot = new char[] { '.' };
            string[] ipArr = ip.Split(dot);
            if (ipArr.Length == 3)
                ip = ip + ".0";
            ipArr = ip.Split(dot);        long ip_Int = 0;
            long p1 = long.Parse(ipArr[0]) * 256 * 256 * 256;
            long p2 = long.Parse(ipArr[1]) * 256 * 256;
            long p3 = long.Parse(ipArr[2]) * 256;
            long p4 = long.Parse(ipArr[3]);
            ip_Int = p1 + p2 + p3 + p4;
            return ip_Int;
        }
        #endregion    #region int转换成IP
        private string IntToIP(long ip_Int)
        {
            long seg1 = (ip_Int & 0xff000000) >> 24;
            if (seg1 < 0)
                seg1 += 0x100;
            long seg2 = (ip_Int & 0x00ff0000) >> 16;
            if (seg2 < 0)
                seg2 += 0x100;
            long seg3 = (ip_Int & 0x0000ff00) >> 8;
            if (seg3 < 0)
                seg3 += 0x100;
            long seg4 = (ip_Int & 0x000000ff);
            if (seg4 < 0)
                seg4 += 0x100;
            string ip = seg1.ToString() + "." + seg2.ToString() + "." + seg3.ToString() + "." + seg4.ToString();        return ip;
        }
        #endregion    #region 获取起始IP范围
        private long GetStartIp(long recNO)
        {
            long offSet = firstStartIp + recNO * 7;
            //objfs.Seek(offSet,SeekOrigin.Begin);
            objfs.Position = offSet;
            byte[] buff = new Byte[7];
            objfs.Read(buff, 0, 7);        endIpOff = Convert.ToInt64(buff[4].ToString()) + Convert.ToInt64(buff[5].ToString()) * 256 + Convert.ToInt64(buff[6].ToString()) * 256 * 256;
            startIp = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) * 256 + Convert.ToInt64(buff[2].ToString()) * 256 * 256 + Convert.ToInt64(buff[3].ToString()) * 256 * 256 * 256;
            return startIp;
        }
        #endregion    #region 获取结束IP
        private long GetEndIp()
        {
            //objfs.Seek(endIpOff,SeekOrigin.Begin);
            objfs.Position = endIpOff;
            byte[] buff = new Byte[5];
            objfs.Read(buff, 0, 5);
            this.endIp = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) * 256 + Convert.ToInt64(buff[2].ToString()) * 256 * 256 + Convert.ToInt64(buff[3].ToString()) * 256 * 256 * 256;
            this.countryFlag = buff[4];
            return this.endIp;
        }
        #endregion    #region 获取国家/区域偏移量
        private string GetCountry()
        {
            switch (this.countryFlag)
            {
                case 1:
                case 2:
                    this.country = GetFlagStr(this.endIpOff + 4);
                    this.local = (1 == this.countryFlag) ? " " : this.GetFlagStr(this.endIpOff + 8);
                    break;
                default:
                    this.country = this.GetFlagStr(this.endIpOff + 4);
                    this.local = this.GetFlagStr(objfs.Position);
                    break;
            }
            return " ";
        }
        #endregion    #region 获取国家/区域字符串
        private string GetFlagStr(long offSet)
        {
            int flag = 0;
            byte[] buff = new Byte[3];
            while (1 == 1)
            {
                //objfs.Seek(offSet,SeekOrigin.Begin);
                objfs.Position = offSet;
                flag = objfs.ReadByte();
                if (flag == 1 || flag == 2)
                {
                    objfs.Read(buff, 0, 3);
                    if (flag == 2)
                    {
                        this.countryFlag = 2;
                        this.endIpOff = offSet - 4;
                    }
                    offSet = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) * 256 + Convert.ToInt64(buff[2].ToString()) * 256 * 256;
                }
                else
                {
                    break;
                }
            }
            if (offSet < 12)
                return " ";
            objfs.Position = offSet;
            return GetStr();
        }
        #endregion    #region GetStr
        private string GetStr()
        {
            byte lowC = 0;
            byte upC = 0;
            string str = "";
            byte[] buff = new byte[2];
            while (1 == 1)
            {
                lowC = (Byte)objfs.ReadByte();
                if (lowC == 0)
                    break;
                if (lowC > 127)
                {
                    upC = (byte)objfs.ReadByte();
                    buff[0] = lowC;
                    buff[1] = upC;
                    System.Text.Encoding enc = System.Text.Encoding.GetEncoding("GB2312");
                    str += enc.GetString(buff);
                }
                else
                {
                    str += (char)lowC;
                }
            }
            return str;
        }
        #endregion    #region 获取IP地址
        public string IPLocation()
        {
            this.QQwry();
            return this.country + this.local;
        }
        public string IPLocation(string dataPath, string ip)
        {
            this.dataPath = dataPath;
            this.ip = ip;
            this.QQwry();
            return this.country + this.local;
        }    #endregion
    }
       
    直接用,把路径设置一下你QQwry
      

  20.   

    内网的IP和外网的IP都不一样,有划分的
      

  21.   

    你自己也说了  内网的就是 192.168.1.XX  
    那你就用服务器判断获得的是不是  192.168.1.XX开头不就完了?  有那么费劲么?当然这是一个吃力不讨好的办法,,,每次开软件就连接你的服务器?
    我要是你  我就做一个 窗体,,此窗体是在每次开启软件,,软件内的Form_Load 方法里判断是否运行
    而他的运行条件是   本地是否存在  connect.ini 的文件   名字我举例说的,,,,
    如果不存在 弹出窗体  让他选择要连接到的服务器 或者是不弹出窗体 就放一个 Combox 你不选不让你进
    他选完  你就帮他生成一个 connect.ini 文件如果有connect.ini文件 把内容读到内存里 判断下 他是内网还是外网用户,,这样只要他没事闲着删connect.ini文件玩   就记住他用什么网络了,,,一举两得,,
    他连第一次开启软件 选以下网络都不愿意  那你干脆给他做两个版本   一个 内部专用版  一个外网专用的   还用他选什么?
      

  22.   

    这样只要他没事闲着删connect.ini文件玩 就记住他用什么网络了,,,一举两得,,错了,,是 不要没事闲着,,,汗……
      

  23.   

    一群傻B
    客户端启动时判断自己的IP是不是:218.85.85.85
    是则连接内网
    如果不是则连接外网
      

  24.   

            /// <summary>
            /// 取得用户客户端IP(穿过代理服务器取远程用户真实IP地址)
            /// </summary>
            public static string GetClientIP()
            {
                if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
                {
                    return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
                }
                else
                {
                    return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
                }
            }
    内网特征:
    10.x.x.x   172.16.x.x至172.31.x.x   192.168.x.x 
    再做判断就可以了