基于VC实现的网络监听功能程序实例

 更新时间:2014年07月26日 16:00:39   投稿:shichen2014  
这篇文章主要介绍了基于VC实现的网络监听功能程序,需要的朋友可以参考下

本文所述VC++网络监听器代码,可以实现监听网络连接所使用的协议、源IP地址、目标IP地址等信息的功能,并且能把数据内容绑定到网格控件中显示。具体功能代码部分如下所示:

//线程函数
UINT ThreadFun( LPVOID pParam )
{
 CSniffAppDlg* pDlg = static_cast<CSniffAppDlg*>(pParam);
 MSG msg;
 char buffer[1000],sourceip[32] ,*tempbuf;
 char *ptemp;
 BYTE* pData = NULL; //实际数据报中的数据
 UINT sourceport ;
 CString str;
 HEADIP*  pHeadIP;
 HEADICMP* pHeadICMP;
 HEADUDP*  pHeadUDP;
 HEADTCP*  pHeadTCP;
 in_addr addr;
 int ret;
 while (TRUE)
 {
 pData = NULL;
 if (PeekMessage(&msg,pDlg->m_hWnd,WM_CLOSE,WM_CLOSE,PM_NOREMOVE ))
 {
  closesocket(pDlg->m_Sock);
  break; 
 }
 memset(buffer,0,1000);
 ret = recv(pDlg->m_Sock,buffer,1000,0);
 
 if (ret == SOCKET_ERROR)
 {
  continue;
 }
 else //接收到数据
 {
  tempbuf = buffer;
  pHeadIP = (HEADIP*)tempbuf;
  //获取数据报总长度
  WORD len = ntohs(pHeadIP->totallen);
  
  //获取源IP
  pDlg->m_List.InsertItem(pDlg->m_List.GetItemCount(),"");
  addr.S_un.S_addr = pHeadIP->sourceIP;
  ptemp = inet_ntoa(addr);
  
  pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,1,ptemp);
 
  //获取目的IP
  addr.S_un.S_addr = pHeadIP->destIP;
  ptemp = inet_ntoa(addr);
  pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,2,ptemp);
  
  //获取协议名称
  ptemp = get_protoname(pHeadIP->proto);
  strcpy(sourceip,ptemp);
  pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,0,sourceip);
  
  //获取IP数据报总长度
  WORD ipSumLen = ntohs(pHeadIP->totallen);
  
  //IP数据报头总长度
  int ipHeadLen = 20;
  //获得去除IP层数据的长度
  WORD netlen = ipSumLen - ipHeadLen;
  
  //根据不同大协议获得不同协议的数据
  switch (pHeadIP->proto)
  {
  case IPPROTO_ICMP:
  {
   pHeadICMP = (HEADICMP*)(tempbuf+20); 
   
   pData = (BYTE*)(pHeadICMP)+4; //ICMP数据报头共4个字节   
   //获取数据的长度
   netlen -= 4;
   break;
  }
  case IPPROTO_UDP:
  {
   pHeadUDP = (HEADUDP*)(tempbuf+20); 
   pData = (BYTE*)pHeadUDP+8; //UDP数据报头共8个字节
   sourceport = ntohs(pHeadUDP->SourcePort);
   str.Format("%d",sourceport);
   //设置源端口
   pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str); 
   str.Empty();
   netlen -= 8;  
   break;
  }
  case IPPROTO_TCP:
  {
   pHeadTCP = (HEADTCP*)(tempbuf+20);
   sourceport = ntohs(pHeadTCP->SourcePort);   
   pData = (BYTE*)pHeadTCP+20; //TCP数据报头共20个字节
   str.Format("%d",sourceport);
   //设置源端口
   pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str); 
   str.Empty();
   netlen-= 20;  
   break;
  }     
  }
  //设置数据大小
  str.Format("%d",netlen);
  pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,4,str);
  str.Empty();
  //设置数据
  if (pData != NULL)
  {
  str.Format(" %s",pData);
  pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,5,str);
  }
  str.Empty();
 }
 }
 return 0;
}
void CSniffAppDlg::OnBeginlisten() 
{
 //创建套接字
 m_Sock = socket(AF_INET,SOCK_RAW, IPPROTO_IP );
 char name[128];
 memset(name,0,128);
 hostent* phostent;
 phostent = gethostbyname(name);
 DWORD ip;
 ip = inet_addr(inet_ntoa(*(in_addr*)phostent->h_addr_list[0]));
 int timeout = 4000; //超时4秒
 //设置接收数据的超时时间
 setsockopt(m_Sock,SOL_SOCKET,SO_RCVTIMEO,(const char*)&timeout,sizeof(timeout));
 sockaddr_in skaddr;
 skaddr.sin_family = AF_INET;
 skaddr.sin_port = htons(700);
 skaddr.sin_addr.S_un.S_addr = ip;
 //绑定地址
 if ( bind(m_Sock,(sockaddr*)&skaddr,sizeof(skaddr))==SOCKET_ERROR)
 {
 MessageBox("地址绑定错误");
 return;
 }
 DWORD inBuffer=1;
 DWORD outBuffer[10];
 DWORD reValue = 0;
 if (WSAIoctl(m_Sock,SIO_RCVALL,&inBuffer,sizeof(inBuffer),&outBuffer,sizeof(outBuffer),&reValue,NULL,NULL)==SOCKET_ERROR)
 {
 MessageBox("设置缓冲区错误.");
 closesocket(m_Sock);
 return;
 }
 else
 m_pThread = AfxBeginThread(ThreadFun,(void*)this);
}
void CSniffAppDlg::OnCancel()
{
 if (m_pThread)
 {
 //m_pThread->ExitInstance();
 delete m_pThread;
 }
 closesocket( m_Sock) ;
 CDialog::OnCancel();
}

该实例只是功能部分主要代码,读者可根据自身项目需求进行测试,加以改进与完善之后整合进自身项目中去。

相关文章

  • VS中scanf函数报错问题的几种解决方法

    VS中scanf函数报错问题的几种解决方法

    本文主要介绍了VS中scanf函数报错问题的几种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++ deque与vector对比的优缺点

    C++ deque与vector对比的优缺点

    这篇文章主要介绍了C++中deque与vector相比的优势与劣势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • C++控制权限关键字protected

    C++控制权限关键字protected

    这篇文章主要介绍了C++控制权限关键字protected,protected和private类似,而对于派生类来说,protected与public类似,下面来一起俩姐更多详细内容吧,需要的小伙伴可以参考一下
    2022-01-01
  • C语言实现学生信息管理系统(多文件)

    C语言实现学生信息管理系统(多文件)

    这篇文章主要为大家详细介绍了C语言实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C/C++实现磁盘相关操作的示例代码

    C/C++实现磁盘相关操作的示例代码

    这篇文章主要为大家详细介绍了C/C++如何实现磁盘相关操作,例如遍历磁盘容量、实现磁盘格式化、移除指定磁盘等,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • C语言中实现自定义数据类型的输入输出的方法和技巧

    C语言中实现自定义数据类型的输入输出的方法和技巧

    在 C 语言中,除了基本的数据类型(如整型、浮点型、字符型等),我们还经常需要自定义数据类型来满足特定的编程需求,所以本文给大家介绍了C语言中实现自定义数据类型的输入输出的方法和技巧,需要的朋友可以参考下
    2024-07-07
  • C/C++ Qt QThread线程组件的具体使用

    C/C++ Qt QThread线程组件的具体使用

    QThread库是QT中提供的跨平台多线程实现方案,本文详细的介绍了Qt QThread线程组件的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Linux下g++编译与使用静态库和动态库的方法

    Linux下g++编译与使用静态库和动态库的方法

    下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • C/C++如何获取当前系统时间的实例详解

    C/C++如何获取当前系统时间的实例详解

    这篇文章主要介绍了 C/C++如何获取当前系统时间的实例详解的相关资料,这里提供了几种实现方法,帮助大家实现这样的功能,需要的朋友可以参考下
    2017-08-08
  • C语言实现扫雷小游戏(适合初学者)

    C语言实现扫雷小游戏(适合初学者)

    这篇文章主要为大家详细介绍了C语言实现扫雷小游戏,适合初学者练习,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论