您的位置:首页 > 理论基础 > 计算机网络

一个网络扫描程序

2006-06-15 15:29 211 查看
1 // ScanNet.cpp: implementation of the ScanNet class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "ty_server.h"
7 #include "ScanNet.h"
8
9 #ifdef _DEBUG
10 #undef THIS_FILE
11 static char THIS_FILE[]=__FILE__;
12 #define new DEBUG_NEW
13 #endif
14
15
16 #define MYSQLIP ("127.0.0.1")
17
18 HANDLE hMutex = NULL;
19 int selfip ; //本机尾ip
20 //////////////////////////////////////////////////////////////////////
21 // Construction/Destruction
22 //////////////////////////////////////////////////////////////////////
23
24 ScanNet::ScanNet()
25 {
26
27 }
28
29 ScanNet::~ScanNet()
30 {
31
32 }
33
34
35 //根据数组组合成字符串
36 char * ScanNet::fmtIPString(int *IP)
37 {
38 char *vResult=new char(16);
39 char *tmp=new char[4];
40
41 _itoa(IP[0],vResult,10);
42 strcat(vResult,".");
43
44 _itoa(IP[1],tmp,10);
45 strcat(vResult,tmp);
46 strcat(vResult,".");
47
48 _itoa(IP[2],tmp,10);
49 strcat(vResult,tmp);
50 strcat(vResult,".");
51
52 _itoa(IP[3],tmp,10);
53 strcat(vResult,tmp);
54 delete tmp;
55 return vResult;
56 }
57
58
59 //根据获取的主机信息,组合为hostmg,然后发送消息
60 void ScanNet::GetHostMsg(char *strip,char *strmac)
61 {
62 // AfxMessageBox("addr: %s mac:%s\n",strip,strmac);
63
64 unsigned char mac[6];
65 char machine_mac[6];
66 unsigned long machine_ip = inet_addr( strip );
67 mac_aton(strmac, mac, ":" );
68 mac_ntoa(mac,machine_mac,"");
69
70 // char adr[100];
71 // sprintf(adr,"addr: %u mac:%s\n",machine_ip,machine_mac);
72 // AfxMessageBox(adr);
73
74 WaitForSingleObject(hMutex,INFINITE);
75
76 yCMysql mysql;
77 if (!mysql.Login (MYSQLIP, "amtty", "", "db"))
78 {
79 mysql.Logout ();
80 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "ScanNet error : Login db fail\n");
81 return ;
82 }
83
84 char sql[300] = {0};
85 sprintf(sql,"select * from tab_zxtj where ip=%u",machine_ip);
86 if(!mysql.QueryRead(sql))
87 {
88 mysql.Logout();
89 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "ScanNet error : QueryRead sql (%s) fail\n", sql);
90 return ;
91 }
92
93 if(!mysql.GetRowNum()) //如果在线状态表中无此机器,插入此机器
94 {
95 sprintf(sql,"insert into tab_zxtj(ip,mac) values(%u,\'%s\')",machine_ip,machine_mac); //默认状态位为0,报警位为0
96 if (!mysql.QueryWrite (sql))
97 {
98 mysql.Logout ();
99 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "ScanNet modify tab_zxtj error : QueryWrite sql (%s) fail\n", sql);
100 return ;
101 }
102 }
103 else
104 {
105 mysql.FreeResult();
106 sprintf(sql,"select * from tab_zxtj where ip=%u and (jqzt = %d or jqzt = %d)",machine_ip,0,3); //第二次扫描时jqzt位还是0或者3,报警
107 if(!mysql.QueryRead(sql))
108 {
109 mysql.Logout();
110 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "ScanNet error : QueryRead sql (%s) fail\n", sql);
111 return ;
112 }
113 if(mysql.GetRowNum())
114 {
115 mysql.FreeResult();
116 sprintf(sql,"update tab_zxtj set jqzt = %d where ip = %u",3,machine_ip); //jqzt位为3报警
117 if (!mysql.QueryWrite (sql))
118 {
119 mysql.Logout ();
120 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "ScanNet modify tab_zxtj error : QueryWrite sql (%s) fail\n", sql);
121 return ;
122 }
123
124 }
125 else
126 {
127 sprintf(sql,"update tab_zxtj set jqzt = %d where ip =%u",0,machine_ip);
128 if (!mysql.QueryWrite (sql))
129 {
130 mysql.Logout ();
131 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "ScanNet modify tab_zxtj error : QueryWrite sql (%s) fail\n", sql);
132 return ;
133 }
134
135 }
136
137 }
138 mysql.Logout ();
139 ReleaseMutex(hMutex);
140 }
141
142 void ScanNet::GetMac(char *strip,char *m_HostMAC)
143 {
144 HRESULT hr;
145 IPAddr ipAddr;
146 ULONG pulMac[2];
147 ULONG ulLen;
148
149 ipAddr = inet_addr( strip );
150 memset( pulMac, 0xff, sizeof(pulMac) );
151 ulLen = 6;
152
153 hr = SendARP( ipAddr, 0, pulMac, &ulLen );
154 // DEBUG ( gbl.is_debug, gbl.debug_level, gbl.log_file, "发送ARP请求结果: %d\n", GetLastError());
155
156 int i,j;
157 PBYTE pbHexMac = (PBYTE) pulMac;
158 for (i=0, j=0; i < 6; ++i)
159 {
160 j += sprintf(m_HostMAC+j, "%02x:", pbHexMac[i]);
161 }
162 m_HostMAC[17] = '\0';
163 // DEBUG ( gbl.is_debug, gbl.debug_level, gbl.log_file, "MAC地址: %s\n", m_HostMAC);
164
165 }
166
167
168 void __cdecl threadproc ( LPVOID pParam )
169 {
170 in_addr s_IP;
171 hostent *host;
172 int *startIP = (int *)pParam;
173 char *strip = ScanNet::fmtIPString(startIP);
174 char *strmac = new char[20];
175 s_IP.S_un.S_addr = inet_addr(strip);
176 host=gethostbyaddr((const char*)&s_IP,sizeof(s_IP),AF_INET);
177 if(host)
178 {
179 ScanNet::GetMac(strip,strmac);
180 ScanNet::GetHostMsg(strip,strmac);
181 }
182 delete strip;
183 delete strmac;
184 }
185
186
187 //实际根据IP地址获取主机信息
188 void ScanNet::GetHostByAddr(int *startIP,int *endIP)
189 {
190 for(; startIP[3] <= endIP[3]; startIP[3]++)
191 {
192 // if(startIP[3] == selfip) //本机ip跳过
193 // {
194 // continue;
195 // }
196 if ( _beginthread(threadproc, 0, (void *)startIP) < 0)
197 {
198 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file,"(ScanNet)启动扫描线程失败!\n");
199 continue;
200 }
201 Sleep(30);
202 if(startIP[3] % 30 == 0)
203 {
204 Sleep(10000); //启动30个线程暂停10秒
205 }
206 }
207
208 }
209
210 //确定IP地址的类型,并将IP地址串解析为四维的整数数组
211 void ScanNet::ParasIP(char *Start_IP,char *End_IP,int *int_startip,int *int_endip)
212 {
213 char s_startip[16];
214 char s_endip[16];
215 strcpy(s_startip,Start_IP);
216 strcpy(s_endip,End_IP);
217
218 int Index; //整数数组的索引
219 char *tmp,*tmp1;
220
221 //处理第一个IP地址:
222 Index=0;
223 tmp=s_startip;
224 tmp1=s_startip;
225
226 while(Index<4)
227 {
228 if(*tmp1=='.')
229 {
230 *tmp1=NULL; //'.'已被赋为null
231 int_startip[Index]=atoi(tmp);
232 Index++;
233 tmp1++;
234 tmp=tmp1;
235 }
236 else if(*tmp1==NULL)
237 {
238 selfip = atoi(tmp); //本机ip
239 int_startip[Index]=/*atoi(tmp)*/1; //扫描起点
240 break;
241 }
242 else tmp1++;
243 }
244
245 //处理第二个IP地址
246 Index=0;
247 tmp=s_endip;
248 tmp1=s_endip;
249
250 while(Index<4)
251 {
252 if(*tmp1=='.')
253 {
254 *tmp1=NULL;
255 int_endip[Index]=atoi(tmp);
256 Index++;
257 tmp1++;
258 tmp=tmp1;
259 }
260 else if(*tmp1==NULL)
261 {
262 int_endip[Index]=/*atoi(tmp)*/254; //扫描终点
263 break;
264 }
265 else tmp1++;
266 }
267
268 }
269
270
271 void ScanNet::ScanHostByAddr(char *HostAddrs,char *HostAddre)
272 {
273 int vsip[4]={0,0,0,0};
274 int veip[4]={0,0,0,0};
275 ParasIP(HostAddrs,HostAddre,vsip,veip); //将字符串解析为数组
276 GetHostByAddr(vsip,veip); //实际的扫描程序
277
278 }
279
280 void ScanNet::Work()
281 {
282 //////////////////
283 // 获得主机名.
284 //////////////////
285 char *m_HostIP = new char[19];
286 char hostname[256];
287 int res = gethostname( hostname, sizeof(hostname) );
288 if (res != 0)
289 {
290 AfxMessageBox("Error1");
291 return ;
292 }
293 // DEBUG ( gb.lis_debug, gbl.debug_level, gbl.log_file, "主机名: %s\n", hostname);
294
295 ////////////////
296 // 根据主机名获取主机信息.
297 //
298 hostent* pHostent = gethostbyname(hostname);
299 if (pHostent == NULL)
300 {
301 AfxMessageBox( "Error: 2");
302 return ;
303 }
304 // DEBUG ( gbl.is_debug, gbl.debug_level, gbl.log_file, "主机信息: %s\n", pHostent);
305
306 //////////////////
307 // 解析返回的hostent信息.
308 //
309 hostent& he = *pHostent;
310 sockaddr_in sa;
311 for ( int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++ )
312 {
313 memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length );
314 strcpy( m_HostIP,inet_ntoa(sa.sin_addr) );
315 }
316 DEBUG ( gbl.is_debug, gbl.debug_level, gbl.log_file, "(ScanNet)主机ip: %s\n", m_HostIP);
317 ScanHostByAddr(m_HostIP,m_HostIP);
318
319 }
320
321 /*功能:初始化
322 入参:无
323 出参:无
324 */
325 int ScanNet::Init ()
326 {
327 WSADATA wsaData;
328 int vst=WSAStartup(MAKEWORD(1,1),&wsaData);
329 if(vst == 0)
330 {
331 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "(ScanNet)WSAStartup初始化成功\n");
332 }
333 else
334 {
335 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "(ScanNet)WSAStartup初始化失败\n");
336 WSACleanup();
337 }
338 return vst;
339 }
340
341 void ScanNet::UpdateZTTAB()
342 {
343 yCMysql mysql;
344 if (!mysql.Login (MYSQLIP, "", "", "db"))
345 {
346 mysql.Logout ();
347 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "(ScanNet)UpdateZTTAB error : Login db fail\n");
348 return ;
349 }
350
351 char sql[300] = {0};
352 sprintf(sql,"update tab_zxtj set jqzt =%d",0);
353
354 if (!mysql.QueryWrite (sql))
355 {
356 mysql.Logout ();
357 DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "(ScanNet)UpdateZTTAB modify tab_zxtj error : QueryWrite sql (%s) fail\n", sql);
358 return ;
359 }
360 mysql.Logout ();
361
362 }
363
364
365 //主函数
366 int ScanNet::Start()
367 {
368 HANDLE hMutex = CreateMutex(NULL,FALSE,NULL);
369 // Sleep(5000); //暂停等待数据库启动
370 if( Init()) //初始化失败
371 {
372 return 0;
373 }
374 UpdateZTTAB(); //重启时状态表状态为0
375 while(1)
376 {
377 Work();
378 Sleep(300000);
379 }
380 return 1;
381 }
382
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: