不上网情况下知道ip获取相应的地理位置
在不上网的情况下。知道某一ip地址获得相应的地理位置。调用一位大侠的写的cs文件。
自己用这个类编写相应的分析.log日志的信息内容。
首先获取相应的ip对应的数据文件。下载这个版本。纯真版QQ IP数据库。里边有一个文件为:QQWry.Dat。这个文件就是存放ip与地理位置相对应的文件。把文件保存在f盘的根目录下
http://www.cz88.net/fox/
第二步:调用相应的.cs文件
其相应的调用方式为:
BDQQ.Data.QQWry qq = new BDQQ.Data.QQWry("f:\\QQWry.Dat");
BDQQ.Data.IPLocation ip = qq.SearchIPLocation(textBox1.Text);//这里添写IP地址
string country = ip.country;
string area = ip.area;
1
using System;2
using System.IO;3
using System.Text;4

5
namespace BDQQ.Data6


{7

/**//**/8

/**//// <summary>9
/// QQWry 的摘要说明。10
/// </summary>11
public class QQWry12

{13
//第一种模式14

第一种模式#region 第一种模式15

/**//**/16

/**//// <summary>17
/// 第一种模式18
/// </summary>19
#endregion20
private const byte REDIRECT_MODE_1 = 0x01;21

22
//第二种模式23

第二种模式#region 第二种模式24

/**//**/25

/**//// <summary>26
/// 第二种模式27
/// </summary>28
#endregion29
private const byte REDIRECT_MODE_2 = 0x02;30

31
//每条记录长度32

每条记录长度#region 每条记录长度33

/**//**/34

/**//// <summary>35
/// 每条记录长度36
/// </summary>37
#endregion38
private const int IP_RECORD_LENGTH = 7;39

40
//数据库文件41

数据库文件#region 数据库文件42

/**//**/43

/**//// <summary>44
/// 文件对象45
/// </summary>46
#endregion47
private FileStream ipFile;48

49
private const string unCountry = "未知国家";50
private const string unArea = "未知地区";51

52
//索引开始位置53

索引开始位置#region 索引开始位置54

/**//**/55

/**//// <summary>56
/// 索引开始位置57
/// </summary>58
#endregion59
private long ipBegin;60

61
//索引结束位置62

索引结束位置#region 索引结束位置63

/**//**/64

/**//// <summary>65
/// 索引结束位置66
/// </summary>67
#endregion68
private long ipEnd;69

70
//IP地址对象71

IP地址对象#region IP地址对象72

/**//**/73

/**//// <summary>74
/// IP对象75
/// </summary>76
#endregion77
private IPLocation loc;78

79
//存储文本内容80

存储文本内容#region 存储文本内容81

/**//**/82

/**//// <summary>83
/// 存储文本内容84
/// </summary>85
#endregion86
private byte[] buf;87

88
//存储3字节89

存储3字节#region 存储3字节90

/**//**/91

/**//// <summary>92
/// 存储3字节93
/// </summary>94
#endregion95
private byte[] b3;96

97
//存储4字节98

存储4字节#region 存储4字节99

/**//**/100

/**//// <summary>101
/// 存储4字节IP地址102
/// </summary>103
#endregion104
private byte[] b4;105

106
//构造函数107

构造函数#region 构造函数108

/**//**/109

/**//// <summary>110
/// 构造函数111
/// </summary>112
/// <param name="ipfile">IP数据库文件绝对路径</param>113
#endregion114
public QQWry(string ipfile)115

{116

117
buf = new byte[100];118
b3 = new byte[3];119
b4 = new byte[4];120
try121

{122
ipFile = new FileStream(ipfile, FileMode.Open);123
}124
catch (Exception ex)125

{126
throw new Exception(ex.ToString());127
}128
ipBegin = readLong4(0);129
ipEnd = readLong4(4);130
loc = new IPLocation();131
}132

133

134
//根据IP地址搜索135

根据IP地址搜索#region 根据IP地址搜索136

/**//**/137

/**//// <summary>138
/// 搜索IP地址搜索139
/// </summary>140
/// <param name="ip"></param>141
/// <returns></returns>142
#endregion143
public IPLocation SearchIPLocation(string ip)144

{145
//将字符IP转换为字节146
string[] ipSp = ip.Split('.');147
if (ipSp.Length != 4)148

{149
throw new ArgumentOutOfRangeException("不是合法的IP地址!");150
}151
byte[] IP = new byte[4];152
for (int i = 0; i < IP.Length; i++)153

{154
IP[i] = (byte)(Int32.Parse(ipSp[i]) & 0xFF);155
}156

157
IPLocation local = null;158
long offset = locateIP(IP);159

160
if (offset != -1)161

{162
local = getIPLocation(offset);163
}164

165
if (local == null)166

{167
local = new IPLocation();168
local.area = unArea;169
local.country = unCountry;170
}171
return local;172
}173

174

175
//取得具体信息176

取得具体信息#region 取得具体信息177

/**//**/178

/**//// <summary>179
/// 取得具体信息180
/// </summary>181
/// <param name="offset"></param>182
/// <returns></returns>183
#endregion184
private IPLocation getIPLocation(long offset)185

{186
ipFile.Position = offset + 4;187
//读取第一个字节判断是否是标志字节188
byte one = (byte)ipFile.ReadByte();189
if (one == REDIRECT_MODE_1)190

{191
//第一种模式192
//读取国家偏移193
long countryOffset = readLong3();194
//转至偏移处195
ipFile.Position = countryOffset;196
//再次检查标志字节197
byte b = (byte)ipFile.ReadByte();198
if (b == REDIRECT_MODE_2)199

{200
loc.country = readString(readLong3());201
ipFile.Position = countryOffset + 4;202
}203
else204
loc.country = readString(countryOffset);205

206
//读取地区标志207
loc.area = readArea(ipFile.Position);208

209
}210
else if (one == REDIRECT_MODE_2)211

{212
//第二种模式213
loc.country = readString(readLong3());214
loc.area = readArea(offset + 8);215
}216
else217

{218
//普通模式219
loc.country = readString(--ipFile.Position);220
loc.area = readString(ipFile.Position);221
}222
return loc;223
}224

225

226
//取得地区信息227

取得地区信息#region 取得地区信息228

/**//**/229

/**//// <summary>230
/// 读取地区名称231
/// </summary>232
/// <param name="offset"></param>233
/// <returns></returns>234
#endregion235
private string readArea(long offset)236

{237
ipFile.Position = offset;238
byte one = (byte)ipFile.ReadByte();239
if (one == REDIRECT_MODE_1 || one == REDIRECT_MODE_2)240

{241
long areaOffset = readLong3(offset + 1);242
if (areaOffset == 0)243
return unArea;244
else245

{246
return readString(areaOffset);247
}248
}249
else250

{251
return readString(offset);252
}253
}254

255

256
//读取字符串257

读取字符串#region 读取字符串258

/**//**/259

/**//// <summary>260
/// 读取字符串261
/// </summary>262
/// <param name="offset"></param>263
/// <returns></returns>264
#endregion265
private string readString(long offset)266

{267
ipFile.Position = offset;268
int i = 0;269
for (i = 0, buf[i] = (byte)ipFile.ReadByte(); buf[i] != (byte)(0); buf[++i] = (byte)ipFile.ReadByte()) ;270

271
if (i > 0)272
return Encoding.Default.GetString(buf, 0, i);273
else274
return "";275
}276

277

278
//查找IP地址所在的绝对偏移量279

查找IP地址所在的绝对偏移量#region 查找IP地址所在的绝对偏移量280

/**//**/281

/**//// <summary>282
/// 查找IP地址所在的绝对偏移量283
/// </summary>284
/// <param name="ip"></param>285
/// <returns></returns>286
#endregion287
private long locateIP(byte[] ip)288

{289
long m = 0;290
int r;291

292
//比较第一个IP项293
readIP(ipBegin, b4);294
r = compareIP(ip, b4);295
if (r == 0)296
return ipBegin;297
else if (r < 0)298
return -1;299
//开始二分搜索300
for (long i = ipBegin, j = ipEnd; i < j; )301

{302
m = this.getMiddleOffset(i, j);303
readIP(m, b4);304
r = compareIP(ip, b4);305
if (r > 0)306
i = m;307
else if (r < 0)308

{309
if (m == j)310

{311
j -= IP_RECORD_LENGTH;312
m = j;313
}314
else315

{316
j = m;317
}318
}319
else320
return readLong3(m + 4);321
}322
m = readLong3(m + 4);323
readIP(m, b4);324
r = compareIP(ip, b4);325
if (r <= 0)326
return m;327
else328
return -1;329
}330

331

332
//读出4字节的IP地址333

读出4字节的IP地址#region 读出4字节的IP地址334

/**//**/335

/**//// <summary>336
/// 从当前位置读取四字节,此四字节是IP地址337
/// </summary>338
/// <param name="offset"></param>339
/// <param name="ip"></param>340
#endregion341
private void readIP(long offset, byte[] ip)342

{343
ipFile.Position = offset;344
ipFile.Read(ip, 0, ip.Length);345
byte tmp = ip[0];346
ip[0] = ip[3];347
ip[3] = tmp;348
tmp = ip[1];349
ip[1] = ip[2];350
ip[2] = tmp;351
}352

353

354
//比较IP地址是否相同355

比较IP地址是否相同#region 比较IP地址是否相同356

/**//**/357

/**//// <summary>358
/// 比较IP地址是否相同359
/// </summary>360
/// <param name="ip"></param>361
/// <param name="beginIP"></param>362
/// <returns>0:相等,1:ip大于beginIP,-1:小于</returns>363
#endregion364
private int compareIP(byte[] ip, byte[] beginIP)365

{366
for (int i = 0; i < 4; i++)367

{368
int r = compareByte(ip[i], beginIP[i]);369
if (r != 0)370
return r;371
}372
return 0;373
}374

375

376
//比较两个字节是否相等377

比较两个字节是否相等#region 比较两个字节是否相等378

/**//**/379

/**//// <summary>380
/// 比较两个字节是否相等381
/// </summary>382
/// <param name="bsrc"></param>383
/// <param name="bdst"></param>384
/// <returns></returns>385
#endregion386
private int compareByte(byte bsrc, byte bdst)387

{388
if ((bsrc & 0xFF) > (bdst & 0xFF))389
return 1;390
else if ((bsrc ^ bdst) == 0)391
return 0;392
else393
return -1;394
}395

396

397
//根据当前位置读取4字节398

根据当前位置读取4字节#region 根据当前位置读取4字节399

/**//**/400

/**//// <summary>401
/// 从当前位置读取4字节,转换为长整型402
/// </summary>403
/// <param name="offset"></param>404
/// <returns></returns>405
#endregion406
private long readLong4(long offset)407

{408
long ret = 0;409
ipFile.Position = offset;410
ret |= (ipFile.ReadByte() & 0xFF);411
ret |= ((ipFile.ReadByte() << 8) & 0xFF00);412
ret |= ((ipFile.ReadByte() << 16) & 0xFF0000);413
ret |= ((ipFile.ReadByte() << 24) & 0xFF000000);414
return ret;415
}416

417

418
//根据当前位置,读取3字节419

根据当前位置,读取3字节#region 根据当前位置,读取3字节420

/**//**/421

/**//// <summary>422
/// 根据当前位置,读取3字节423
/// </summary>424
/// <param name="offset"></param>425
/// <returns></returns>426
#endregion427
private long readLong3(long offset)428

{429
long ret = 0;430
ipFile.Position = offset;431
ret |= (ipFile.ReadByte() & 0xFF);432
ret |= ((ipFile.ReadByte() << 8) & 0xFF00);433
ret |= ((ipFile.ReadByte() << 16) & 0xFF0000);434
return ret;435
}436

437

438
//从当前位置读取3字节439

从当前位置读取3字节#region 从当前位置读取3字节440

/**//**/441

/**//// <summary>442
/// 从当前位置读取3字节443
/// </summary>444
/// <returns></returns>445
#endregion446
private long readLong3()447

{448
long ret = 0;449
ret |= (ipFile.ReadByte() & 0xFF);450
ret |= ((ipFile.ReadByte() << 8) & 0xFF00);451
ret |= ((ipFile.ReadByte() << 16) & 0xFF0000);452
return ret;453
}454

455

456
//取得begin和end之间的偏移量457

取得begin和end之间的偏移量#region 取得begin和end之间的偏移量458

/**//**/459

/**//// <summary>460
/// 取得begin和end中间的偏移461
/// </summary>462
/// <param name="begin"></param>463
/// <param name="end"></param>464
/// <returns></returns>465
#endregion466
private long getMiddleOffset(long begin, long end)467

{468
long records = (end - begin) / IP_RECORD_LENGTH;469
records >>= 1;470
if (records == 0)471
records = 1;472
return begin + records * IP_RECORD_LENGTH;473
}474
} //class QQWry475

476
public class IPLocation477

{478
public String country;479
public String area;480

481
public IPLocation()482

{483
country = area = "";484
}485

486
public IPLocation getCopy()487

{488
IPLocation ret = new IPLocation();489
ret.country = country;490
ret.area = area;491
return ret;492
}493
}494
}495

第三步:这是自己的文件用来分析一个相应的.log日志文件。
1
using System;2
using System.Collections.Generic;3
using System.ComponentModel;4
using System.Data;5
using System.Drawing;6
using System.Text;7
using System.Windows.Forms;8

9
using System.IO;10

11
namespace IpAddress12


{13
public partial class Form1 : Form14

{15
//保存路径16
string path = "null";17
StrText st;18

19
public Form1()20

{21
InitializeComponent();22
path = "";23

24
//皮肤25
skinEngine1.SkinFile = "Page.ssk";26
}27

28
private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)29

{30
//路径信息31
string path;32

33
//文本内容34
string strText;35

36
openFileDialog1.FileName = "*.log";37
openFileDialog1.Filter = "文本文件(*.log)|*.log";38
openFileDialog1.RestoreDirectory = true;39
openFileDialog1.FilterIndex = 1;40
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)41

{42
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);43
FileInfo info = new FileInfo(openFileDialog1.FileName);44
StreamReader sr = new StreamReader(openFileDialog1.FileName, Encoding.Default);45
path = openFileDialog1.FileName;46
//richTextBox1.Text = sr.ReadToEnd();47
strText = sr.ReadToEnd(); 48
R(strText);49
sr.Close();50
}51
}52

53
//private void Read(string strText)54
//{55
// richTextBox1.Text = "";56
// int i = strText.Length;57

58
// //计算共有多少行59
// int num=0;60

61
// //把字符串转化为字符数组62
// char[] myChar = new char[i];63

64
// //寻找enzhuji的位置的数组65
// char[] enChar=new char[7];66

67
// //访问时间68
// string time;69
70
// //访问地点71
// string local;72
73
// //记录访问页面74
// string tail;75

76
// //保存结果77
// StringBuilder sb = new StringBuilder();78

79

80
// enChar[0]='E';81
// enChar[1]='N';82
// enChar[2]='Z';83
// enChar[3]='H';84
// enChar[4]='U';85
// enChar[5]='J';86
// enChar[6]='I';87

88
// BDQQ.Data.QQWry qq = new BDQQ.Data.QQWry("d:\\QQWry.Dat");89

90
// myChar = strText.ToCharArray();91
92
// foreach (char ch in myChar)93
// {94
// if (ch == '\n')95
// num++;96
// }97

98
// string [] myStr=new string [num];99
100
// myStr=strText .Split('\n');101

102
// for (int j = 0; j < num; j++)103
// {104
// //计算每行的长度105
// int n = myStr[j].Length;106

107
// //把每行转换成字符数组108
// char [] chaAr=new char [n];109
// chaAr = myStr[j].ToCharArray();110

111
// //如果倒数第六个字符为m则认为访问了htm页面112
// if (chaAr[n - 6] == 'm')113
// {114
// //计算enzhuji的位置115
// int address = myStr[j].IndexOfAny(enChar);116
117
// //求出时间118
// time = myStr[j].Substring(address + 15, 20);119
120
// //求出地址121
// local = myStr[j].Substring(address + 35, 16);122

123
// int loc=local.LastIndexOf(' ');124

125
// //求出ip信息126
// local = local.Substring(0, loc);127
// tail = myStr[j].Substring(myStr[j].Length-16,11);128
129
// BDQQ.Data.IPLocation ip = qq.SearchIPLocation(local);//这里添写IP地址 130

131
// string country = ip.country;132
// string area = ip.area;133

134
// sb.Append(time + " " +local+" "+ tail+" "+country+" "+area + "\n");135
136
// }137
// }138

139
// richTextBox1.Text = sb.ToString();140
//}141

142
private void R(string strText)143

{144
string str;145
richTextBox1.Text = "";146
st = new StrText(strText);147
str = st.Read();148
richTextBox1.Text = str;149
}150

151
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)152

{153
if (this.path.Equals("") == true)154

{155
SaveFileDialog sf = new SaveFileDialog();156
sf.Title = "保存";157
sf.InitialDirectory = "c:\\";158
sf.Filter = "All files (*.*)|*.*|文本文档 (*.txt)|*.txt";159
sf.FilterIndex = 1;160
if (sf.ShowDialog() == DialogResult.OK)161

{162
StreamWriter asw = new StreamWriter(sf.FileName, false, Encoding.Default);163
asw.Write(richTextBox1.Text);164
asw.Close();165
}166

167
}168
else169

{170
StreamWriter sw = new StreamWriter(path, false, Encoding.Default);171
sw.Write(richTextBox1.Text);172
sw.Close();173
}174
}175

176
private void 查询IpToolStripMenuItem_Click(object sender, EventArgs e)177

{178
Form2 fr = new Form2();179
fr.ShowDialog();180
}181
}182
}
1
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace IpAddress6


{7
class StrText8

{9
private string strText;10
11
public StrText(string strText)12

{13
this.strText = strText;14
}15

16
public string Read()17

{18
int i = strText.Length;19

20
//计算共有多少行21
int num = 0;22

23
//把字符串转化为字符数组24
char[] myChar = new char[i];25

26
//寻找enzhuji的位置的数组27
char[] enChar = new char[7];28

29
//访问时间30
string time;31

32
//访问地点33
string local;34

35
//记录访问页面36
string tail;37

38
//保存结果39
StringBuilder sb = new StringBuilder();40

41

42
enChar[0] = 'E';43
enChar[1] = 'N';44
enChar[2] = 'Z';45
enChar[3] = 'H';46
enChar[4] = 'U';47
enChar[5] = 'J';48
enChar[6] = 'I';49

50
BDQQ.Data.QQWry qq = new BDQQ.Data.QQWry("d:\\QQWry.Dat");51

52
myChar = strText.ToCharArray();53

54
foreach (char ch in myChar)55

{56
if (ch == '\n')57
num++;58
}59

60
string[] myStr = new string[num];61

62
myStr = strText.Split('\n');63

64
for (int j = 0; j < num; j++)65

{66
//计算每行的长度67
int n = myStr[j].Length;68

69
//把每行转换成字符数组70
char[] chaAr = new char[n];71
chaAr = myStr[j].ToCharArray();72

73
//如果倒数第六个字符为m则认为访问了htm页面74
if (chaAr[n - 6] == 'm')75

{76
//计算enzhuji的位置77
int address = myStr[j].IndexOfAny(enChar);78

79
//求出时间80
time = myStr[j].Substring(address + 15, 20);81

82
//求出地址83
local = myStr[j].Substring(address + 35, 16);84

85
int loc = local.LastIndexOf(' ');86

87
//求出ip信息88
local = local.Substring(0, loc);89
tail = myStr[j].Substring(myStr[j].Length - 16, 11);90

91
BDQQ.Data.IPLocation ip = qq.SearchIPLocation(local);//这里添写IP地址 92

93
string country = ip.country;94
string area = ip.area;95

96
sb.Append(time + " " + local + " " + tail + " " + country + " " + area + "\n");97

98
}99
}100

101
return sb.ToString();102
}103
}104
}105

浙公网安备 33010602011771号