自己做的简单的socket原始套接字截获ip数据包

  看了一些网络上的资料,做课程实习搞了个
  供大家参考
  
#include “stdafx.h”
#include
#include
#include
#include
#include “stdio.h”
  
  #pragma comment(lib,”ws2_32.lib”)
  #pragma comment(lib,”netapi32.lib”)
  #pragma comment(lib,”wsock32.lib”)
  
  #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
  #define BUFFER_SIZE 65535
  
  typedef struct _IP_HEADER //定义IP头
  {
   union
   {
   BYTE Version; //版本(前4位)
   BYTE HdrLen; //报头标长(后4位),IP头的长度
   };
   BYTE ServiceType; //服务类型
   WORD TotalLen; //总长度
   WORD ID; //标识
   union
   {
   WORD Flags; //标志(前3位)
   WORD FragOff; //分段偏移(后13位)
   };
   BYTE TimeToLive; //生命期
   BYTE Protocol; //协议
   WORD HdrChksum; //头校验和
   DWORD SrcAddr; //源地址
   DWORD DsrAddr; //目的地址
   BYTE Options; //选项
  }IP_HEADER;
  
  char buffer[BUFFER_SIZE];
  
  int main(int argc, char* argv[])
  {
  
   WORD wVersionRequested;
   WSADATA WsaData;
   int err;
   wVersionRequested = MAKEWORD( 2, 2 );
   err = WSAStartup(wVersionRequested,&WsaData);
   if ( err != 0 )
   {
   return 0;
   }
   if ( LOBYTE( WsaData.wVersion ) != 2 || HIBYTE( WsaData.wVersion ) != 2 )
   {
   WSACleanup();
   return 0;
   }
  
  
   ofstream ofs(argv[1],ios::app);
   /*创建原始套接字*/
   SOCKET sock;
   sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
  // sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
  
   /*设置IP头操作选项*/
   BOOL flag=true;
   setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));
  
   /*socket初始化*/
   /*获取主机名*/
   char hostName[128];
   gethostname(hostName,128);
   /*获取本机IP地址*/
   hostent *pHostIP;
   pHostIP=gethostbyname(hostName);
   /*填充SOCKADDR_IN结构的内容*/
   //cout<><>
   sockaddr_in addr_in;
   addr_in.sin_addr=*(in_addr *)(pHostIP->h_addr_list[0]);
   addr_in.sin_family=AF_INET;
   addr_in.sin_port=htons(6000);
  /*绑定socket*/
   bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));
  
  /*设置网卡为混杂模式*/
   DWORD dwBufferLen[10];
   DWORD dwBufferInLen=1;
   DWORD dwBytesReturned=0;
   WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,
   sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);
  
  /*接收数据包*/
  while(true)
  {
   int DF;
   int MF;
   recv(sock,buffer,BUFFER_SIZE,0); //接收数据抱
   IP_HEADER ip=*(IP_HEADER *)buffer;
   /*解析数据包*/
   ofs<><(ip.version>>4)
   ofs<><(ip.hdrlen &="">
   ofs<><(ip.servicetype>>5)
   ofs<><((ip.servicetype>>1) & 0x0f)
   ofs<><>
   ofs<><>
   ofs<><(df=((ip.flags>>14)&0x01))
   ofs<><(mf=((ip.flags>>13)&0x01))<>
   ofs<><(ip.fragoff>
   ofs<><>
   ofs<><>
   ofs<><>
   ofs<><>
   ofs<><>
  
   cout<><(ip.version>>4)
   cout<><(ip.hdrlen &="">
   cout<><(ip.servicetype>>5)
   cout<><((ip.servicetype>>1) & 0x0f)
   cout<><>
   cout<><>
   cout<><(df=((ip.flags>>14)&0x01))
   cout<><(mf=((ip.flags>>13)&0x01))<>
   cout<><(ip.fragoff>
   cout<><>
   cout<><>
   cout<><>
   cout<><>
   cout<><>
  
  
  }
  return 0;
  }
  
  
  
  

分类:VC++ 相关 | 评论:0 | 浏览:1583 | 举报 | 收藏 |

网友评论:我要评论
暂无评论!

发布评论: