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, 0xffsizeof(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