基于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(); }
该实例只是功能部分主要代码,读者可根据自身项目需求进行测试,加以改进与完善之后整合进自身项目中去。
下一篇: 基于C语言实现的迷宫游戏代码
相关文章
- 这篇文章主要介绍了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请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
vc提示unexpected end of file found的原因分析
这篇文章主要介绍了vc提示unexpected end of file found的原因分析,给出了几点常见错误原因的分析,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
Springmvc ResponseBody响应json数据实现过程
这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26- 本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
- 这篇文章主要介绍了CocosCreator MVC架构,同学们在制作游戏过程中,尽量使用一些架构,会避免很多问题...2021-04-16
- Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。...2021-02-06
- 这篇文章主要为大家介绍了javascript中的MVC模式,MVC是一种软件架构模式,一般把软件模式分为三部分,本文就针对MVC模式的三部分进行讲解,感兴趣的小伙伴们可以参考一下...2016-02-01
- 这篇文章主要介绍了仅30行代码实现Javascript中的MVC的方法,MVC的基础是观察者模式,这是实现model和view同步的关键,想要深入了解的朋友可以参考本文...2016-02-18
使用jQuery.form.js/springmvc框架实现文件上传功能
这篇文章主要介绍了使用jQuery.form.jsspringmvc框架实现文件上传功能,非常具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-05-14- 这篇文章主要介绍了SpringMVC和rabbitmq集成的使用案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-20
- 本文主要讲解AngularJS MVC体系结构,这里提供详细的教程供大家学习参考,有需要的小伙伴可以参考下...2016-08-24
web面试MVC与MVVM区别及Vue为什么不完全遵守MVVM解答
这篇文章主要介绍了web面试中常问问题,MVC与MVVM区别以及Vue为什么不完全遵守MVVM的难点解答,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-24- 本篇文章主要介绍了ASP.NET MVC API 接口验证的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22
SpringMVC中的handlerMappings对象用法
这篇文章主要介绍了SpringMVC中的handlerMappings对象用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-26ASP.NET Core MVC如何实现运行时动态定义Controller类型
这篇文章主要介绍了ASP.NET Core MVC如何实现运行时动态定义Controller类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 这篇文章主要介绍了VC中CDC、HDC、pDC区别与联系及相互转换的方法,非常的详细,有需要的小伙伴可以参考下,希望对大家学习VC能够有所帮助。...2020-04-25