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

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索vc
网络监听
go语言实现socket实例、vc6 实现多语言版、javaweb监听器实例、oracle 两个实例 监听、oracle多实例监听配置,以便于您获取更多的相关知识。

时间: 2024-08-30 06:00:56

基于VC实现的网络监听功能程序实例_C 语言的相关文章

C语言编写基于TCP和UDP协议的Socket通信程序示例_C 语言

Tcp多线程服务器和客户端程序服务器程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 char

VC实现的病毒专杀工具完整实例_C 语言

本文实例讲述了VC实现的病毒专杀工具的方法.非常实用,分享给大家供大家参考.具体实现方法如下: 如今病毒木马蠕虫层出不穷,变种也是一个接一个.反病毒公司以及各大安全公司随着影响很大的病毒的出现都会免费提供病毒专杀工具,这个举措对普通用户来说确实很有帮助.其实写病毒专杀工具也不像大家想象的那么神秘,利用SDK写个控制台程序来实现病毒专杀,因无须写图形界面,所以简便快捷!你自己也能写!不信?就接着看吧^_^ 废话不说了,接下来就开始谈谈病毒专杀工具的思路及实现方法. 本文中讲解的病毒专杀工具是针对木

VC实现图片拖拽及动画的实例_C 语言

基础知识 1.PictureBox控件的使用 2.加载位图文件 1.通过文件路径获得位图句柄 复制代码 代码如下: //获得位图句柄  void CMovePictureDlg::GetHandleFromPath(CString path)  {      hBitmap= (HBITMAP)::LoadImage(AfxGetInstanceHandle(),path,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);//创建位图句柄

DTCC2013:基于网络监听数据库安全审计

本文讲的是DTCC2013:基于网络监听数据库安全审计,2013年4月18-20日,第四届中国数据库技术大会(DTCC 2013)在北京福朋喜来登酒店拉开序幕.在为期三天的会议中,大会将围绕大数据应用.数据架构.数据管理(数据治理).传统数据库软件等技术领域展开深入探讨,并将邀请一批国内顶尖的技术专家来进行分享.本届大会将在保留数据库软件应用实践这一传统主题的基础上,向大数据.数据结构.数据治理与分析.商业智能等领域进行拓展,以满足于广大从业人士和行业用户的迫切需要. 自2010年以来,国内领先

如何防止网络监听与端口扫描

1.使用安全工具 有许多工具可以让我们发现系统中的漏洞,如SATAN等.SATAN是一个分析网络的管理.测试和报告许多信息,识别一些与网络相关的安全问题. 对所发现的问题,SATAN提供对这个问题的解释以及可能对系统和网络安全造成影响的程度,并且通过工具所附的资料,还能解释如何处理这些问题. 当然还有很多像这样的安全工具.包括对TCP端口的扫描或者对多台主机的所有TCP端口实现监听:分析网络协议.监视控制多个网段等,正确使用这些安全工具,及时发现系统漏洞,才能防患于未然. 而对于WindowsN

UNIX系统管理:网络监听概念

网络监听工具的提供给管理员的一类管理工具.使用这种工具,可以监视网络的状态.数据流动情况以及网络上传输的信息. 但是网络监听工具也是黑客们常用的工具.当信息以明文的形式在网络上传输时,便可以使用网络监听的方式来进行攻击.将网络接口设置在监听模式,便可以源源不断地将网上传输的信息截获. 网络监听可以在网上的任何一个位置实施,如局域网中的一台主机.网关上或远程网的调制解调器之间等.黑客们用得最多的是截获用户的口令. 1什么是网络监听 网络监听是黑客们常用的一种方法.当成功地登录进一台网络上的主机,并

数据中心面对的网络监听技术

数据中心里最宝贵的就是数据,这些数据里隐含着很多私有的.机密信息,小到个人隐私,大到国家安全,所以保护数据是数据中心最为关键的任务,数据一旦被窃取被泄露,给数据中心带来的损失无法估计.然而,这些数据在数据中心里以及外部并不是静止的,躺在存储硬盘里睡大觉,而是通过网络在不断传递和变化着,网络成为数据传递的最为重要通道,无论是数据中心内部还是外部.对网络进行监听,就可以掌握数据的基本信息和特征,听起来网络监听这个词语贬义成分居多.而实际上,对网络监听对于数据中心管理非常重要.不过的确是凡事都有其两面

美国网络监听系统曝光:服务器遍布世界

美国"截击"网站1日根据前防务承包商雇员斯诺登提供的秘密文件,进一步曝光美国国家安全局进行网络监听所使用的情报收集工具,披露这一间谍系统的使用广度.深度和功能. "截击"网站公布了斯诺登提供的48份相关绝密文件,其中有的文件注明日期近至2013年.这些文件显示,美国安局利用一个名为XKEYSCORE的情报收集系统,可收集人们在互联网上留下的信息.国安局的一份文件称之为"影响最广泛的系统". 据报道,截至2008年,这一系统拥有700多个服务器,分

移动-java tree.addMouseMotionListener();鼠标监听功能

问题描述 java tree.addMouseMotionListener():鼠标监听功能 1C tree.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent arg0) { //鼠标移动 int x = (int) arg0.getPoint().getX(); int y = (int) arg0.getPoint().getY(); System.out