资源简介
运用C++程序编程 实现IP数据报的捕获和解析 工程文件和课程设计报告全部都有 物超所值!
代码片段和文件信息
#include
#include
#include
#include
#pragma comment(lib“ws2_32“) //指定连接到网络应用和internet
#define IO_RCVALL _WSAIOW(IOC_VENDOR1)
typedef struct IP_HEAD
{
union //定义联合
{
unsigned char Version;
unsigned char HeadLen;
};
unsigned char ServiceType;
unsigned short TotalLen;
unsigned short Identifier;
union
{
unsigned short Flags;
unsigned short FragOffset;
};
unsigned char TimeToLive;
unsigned char Protocol;
unsigned short HeadChecksum;
unsigned int SourceAddr;
unsigned int DestinAddr;
unsigned char Options;
}ip_head; //定义IP头部的数据结构
void main(int argcchar *argv[])
{
using namespace std;
ofstream outfile(“C:\\file1.txt“ios::out);
if(argc!=2)
{
cout< return;
}
WSADATA WSAData;
if(WSAStartup(MAKEWORD(22) &WSAData)!=0)
{
cout< return;
}
SOCKET sock=socket(AF_INETSOCK_RAWIPPROTO_IP); //三个参分别为通信发生的区字段,套接字的类型,与IP协议
if(sock==INVALID_SOCKET)
{
cout< closesocket(sock);
WSACleanup();
//goto exit_clean;
}
BOOL flag=TRUE;
//设置SockRaw这个套接字的ip选项中的IP_HDRINCL(包含首部)
if(setsockopt(sockIPPROTO_IPIP_HDRINCL(char *) &flagsizeof(flag))==SOCKET_ERROR)
{
cout< closesocket(sock);
WSACleanup();
//goto exit_clean;
}
char hostName[128]; //获取主机名
if(gethostname(hostName100)==SOCKET_ERROR)
{
cout< closesocket(sock);
WSACleanup();
//goto exit_clean;
}
hostent *pHostIP; //获取本地IP
if((pHostIP=gethostbyname(hostName))==NULL)
{
cout< closesocket(sock); //绑定网卡
WSACleanup();
//goto exit_clean;
}
sockaddr_in host_addr;
host_addr.sin_family=AF_INET;
host_addr.sin_port=htons(6000);
host_addr.sin_addr=*(in_addr *)pHostIP->h_addr_list[0];
if(bind(sock(PSOCKADDR)&host_addrsizeof(host_addr))==SOCKET_ERROR)
{
cout< closesocket(sock);
WSACleanup();
//goto exit_clean;
}
DWORD dwBufferLen[10];
DWORD dwBufferInLen=1;
DWORD dwBytesReturned=0;
if(WSAIoctl(sock IO_RCVALL &dwBufferInLen sizeof(dwBufferInLen) &dwBufferLensizeof(dwBufferLen)&dwBytesReturnedNULLNULL)==SOCKET_ERROR)
{
cout< closesocket(sock); //将网卡设为混杂模式,以接受所有数据
WSACleanup();
//goto exit_clean;
}
cout< char buffer[65535]; //设置缓冲区
int packsum=atoi(argv[1]); //字符串转换为整形
for(int i=0;i {
if(recv(sockbuffer655350)>0) //四个参数分别是套接字描述符,缓冲区的地址,缓冲区大小,附加标志
{
ip_head ip=*(ip_head *)buffer;
cout<<“-----------------------“< cout<<“版本:“<<(ip.Version>>4)< cout<<“头部长度:“<<((ip.HeadLen &0x0f)*4)< cout<<“服务类型:Priority“<<(ip.ServiceType>>5)<<“ Service“<<((ip.ServiceType>>1)&0x0
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 162816 2009-06-25 10:07 二版\IP数据包.doc
文件 4729 2009-06-25 09:43 二版\ipparse\ipparse.cpp
文件 3413 2009-06-25 10:07 二版\ipparse\ipparse.dsp
文件 539 2009-06-25 10:07 二版\ipparse\ipparse.dsw
文件 41984 2009-06-25 10:07 二版\ipparse\ipparse.ncb
文件 48640 2009-06-25 10:07 二版\ipparse\ipparse.opt
文件 751 2009-06-25 10:07 二版\ipparse\ipparse.plg
文件 557149 2009-06-25 10:07 二版\ipparse\Debug\ipparse.exe
文件 820384 2009-06-25 10:07 二版\ipparse\Debug\ipparse.ilk
文件 266762 2009-06-25 10:07 二版\ipparse\Debug\ipparse.obj
文件 5635388 2009-06-25 10:07 二版\ipparse\Debug\ipparse.pch
文件 1131520 2009-06-25 10:07 二版\ipparse\Debug\ipparse.pdb
文件 197632 2009-06-25 10:07 二版\ipparse\Debug\vc60.idb
文件 143360 2009-06-25 10:07 二版\ipparse\Debug\vc60.pdb
目录 0 2010-06-28 06:44 二版\ipparse\Debug
目录 0 2010-06-28 06:44 二版\ipparse
目录 0 2010-06-28 06:44 二版
----------- --------- ---------- ----- ----
9015067 17
评论
共有 条评论