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

 更新时间:2020年4月25日 17:41  点击:2119

本文所述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();
}

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

[!--infotagslink--]

相关文章

  • SpringMVC文件上传原理及实现过程解析

    这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • vc提示unexpected end of file found的原因分析

    这篇文章主要介绍了vc提示unexpected end of file found的原因分析,给出了几点常见错误原因的分析,需要的朋友可以参考下...2020-04-25
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • Springmvc ResponseBody响应json数据实现过程

    这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
  • 详解CocosCreator MVC架构

    这篇文章主要介绍了CocosCreator MVC架构,同学们在制作游戏过程中,尽量使用一些架构,会避免很多问题...2021-04-16
  • Spring MVC 处理一个请求的流程

    Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。...2021-02-06
  • 理解javascript中的MVC模式

    这篇文章主要为大家介绍了javascript中的MVC模式,MVC是一种软件架构模式,一般把软件模式分为三部分,本文就针对MVC模式的三部分进行讲解,感兴趣的小伙伴们可以参考一下...2016-02-01
  • 仅30行代码实现Javascript中的MVC

    这篇文章主要介绍了仅30行代码实现Javascript中的MVC的方法,MVC的基础是观察者模式,这是实现model和view同步的关键,想要深入了解的朋友可以参考本文...2016-02-18
  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    这篇文章主要介绍了使用jQuery.form.jsspringmvc框架实现文件上传功能,非常具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-05-14
  • SpringMVC和rabbitmq集成的使用案例

    这篇文章主要介绍了SpringMVC和rabbitmq集成的使用案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-20
  • AngularJS教程之MVC体系结构详解

    本文主要讲解AngularJS MVC体系结构,这里提供详细的教程供大家学习参考,有需要的小伙伴可以参考下...2016-08-24
  • web面试MVC与MVVM区别及Vue为什么不完全遵守MVVM解答

    这篇文章主要介绍了web面试中常问问题,MVC与MVVM区别以及Vue为什么不完全遵守MVVM的难点解答,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-24
  • ASP.NET MVC API 接口验证的示例代码

    本篇文章主要介绍了ASP.NET MVC API 接口验证的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22
  • SpringMVC中的handlerMappings对象用法

    这篇文章主要介绍了SpringMVC中的handlerMappings对象用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-26
  • ASP.NET Core MVC如何实现运行时动态定义Controller类型

    这篇文章主要介绍了ASP.NET Core MVC如何实现运行时动态定义Controller类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • VC中CDC、HDC、pDC区别与联系及相互转换

    这篇文章主要介绍了VC中CDC、HDC、pDC区别与联系及相互转换的方法,非常的详细,有需要的小伙伴可以参考下,希望对大家学习VC能够有所帮助。...2020-04-25