假设有 N 个的客户端应用程序,分别在内网、外网应用。但是在应用程序中,连接服务器的IP地址,在客户端是如何区分,要连接的是内网服务器IP还是外网服务器IP?假设内网IP:192.168.1.99、外网则:218.85.85.85现在想到2个办法,但都感觉不“好”。
1、尝试 Open 内网的 SQL SERVER Connection,通过则为内网。
2、加一个下拉框给客户。但体验感不好。
1、尝试 Open 内网的 SQL SERVER Connection,通过则为内网。
2、加一个下拉框给客户。但体验感不好。
解决方案 »
- csdn 2012年度.NET最有价值问题评选第一名的问题
- 这段代码怎么理解?~大家给点提示吧!!
- 串口问题 求救
- 在Oracle中用Decode函数如何对输出的字段进行判断?
- 我把一个对象以MemoryStream的方式存到一个资源文件(.resx)中,我如何把其取出来?
- DBF格式的数据用C#倒入到sqlserver数据库的问题
- 请问C/S系统的数据库连接该怎么连呢?数据库的用户名和密码放在哪里?
- 随机生成一非常长的01字符串,如何判断其出现的周期?
- 我已经能够用程序找到“记事本”窗口。但是我怎么做能够把 记事本 窗口获得焦点呢?
- 错在哪?
- 请问,如何将局域网上的共享文件复制到本地??急。。
- 请教一个关于页面的刷新和MasterPage的问题。
是的。所有的内网用户都是:192.168.1.XX
但是,如果外网用户,他们拥有自己的局域网,也有 192.168.1.XX 呢?
不知道您指的的“运算”,是什么,希望不吝赐教。
不知道您指的的“运算”,是什么,希望不吝赐教。如果别人也是在局域网内,你是无法直接访问的,即使能够访问,也只能是通过它的外网IP,这一点是不需要考虑的。我说的是“与运算”,二进制与运算。
不不不,您误会我的意思了。我的意思是:外网连接外网IP,内网连接内网IP。但是,如何判断要连接的是内网还是外网。
ping一下不就可以了吗?
而外网客户端是访问不到 192.168.1.99的
其他的你用外网
你的意思是说,比较 2 个外网 IP 是否一致?如果不一致就使用外网?如果一致就使用内网?这样的策略有想过,但是获取外网IP,似乎要通过“第三方”(如查询公网IP的网站)来获取自己的ip地址。
每次让他请求你的服务端,,,然后你的服务端根据请求IP 是 192.168.1 开头的 就给他返回特征码 告诉他是局域网的,,如果不是 就返回是外网的,,,只要你别用穿透代理的方法去获取IP 那就不会得到他的深层IP 这样就OK了,,,
那他访问你 你获得的必然是 192.168.1.XX 除非你本机 是 127.0.0.1这样你就可以判断出来是不是和你同一个局域网了
http://zhidao.baidu.com/question/41083580.html?fr=ala0
B类IP默认子网掩码:255.255.0.0
C类IP默认子网掩码:255.255.255.0
这样你的程序就可以自动得到正确的连接IP了.
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
那你就用服务器判断获得的是不是 192.168.1.XX开头不就完了? 有那么费劲么?当然这是一个吃力不讨好的办法,,,每次开软件就连接你的服务器?
我要是你 我就做一个 窗体,,此窗体是在每次开启软件,,软件内的Form_Load 方法里判断是否运行
而他的运行条件是 本地是否存在 connect.ini 的文件 名字我举例说的,,,,
如果不存在 弹出窗体 让他选择要连接到的服务器 或者是不弹出窗体 就放一个 Combox 你不选不让你进
他选完 你就帮他生成一个 connect.ini 文件如果有connect.ini文件 把内容读到内存里 判断下 他是内网还是外网用户,,这样只要他没事闲着删connect.ini文件玩 就记住他用什么网络了,,,一举两得,,
他连第一次开启软件 选以下网络都不愿意 那你干脆给他做两个版本 一个 内部专用版 一个外网专用的 还用他选什么?
客户端启动时判断自己的IP是不是:218.85.85.85
是则连接内网
如果不是则连接外网
/// 取得用户客户端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
再做判断就可以了