zoukankan      html  css  js  c++  java
  • 一个网络扫描程序

      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 
  • 相关阅读:
    论JS函数传参时:值传递与引用传递的区别
    关于 rem
    致——自己
    用CSS3写的钟表
    HTML标签marquee实现滚动效果
    手机号截取
    CSS3绘制环形进度条
    限制内容长度(CSS,jQuery)
    移动web开发中遇到的一些问题收纳
    移动平台中 meta 标签的使用
  • 原文地址:https://www.cnblogs.com/zjz/p/426589.html
Copyright © 2011-2022 走看看