使用套接字编程实现捕获一段时间内以本机为源地址或目的地址的IP数据包(不包括以广播形式发出的数据包),统计IP数据包的信息,列出本机与其他主机之间不同协议类型IP数据包的数量 及流量。以源地址 目的地址 协议类型 数据包数量 流量的格式输出统计信息。
1、IP数据报格式:
(1)版本:表示所使用的IP协议的版本,4表示IPv4,6表示IPv6
(2)报头长度:以4B为单位指定了IP数据包报头的长度。
(3)服务类型:指示了路由器应该如何处理该数据报。
(4)总长度:以字节为单位具体说明包括报头在内的整个IP数据报的长度,占16位,所以IP数据报最长可达65535B
(5)标识:用来唯一标识主机发送的每一份数据报,通常每发送一份报文它的值会加1
(6)标志:标志字段占3位,第一位保留并总设为0;第二位是禁止分片标志DF,该位为0,说明数据报可以被分片;第三位是分片标志MF,只有再DF为0才有效,用以标识此报文是否是这系列分片的最后一个,为0 标识接收到的是最后一个分片。
(7)片偏移:给出了每一个分片在完整IP数据报中的相对位置。片偏移以8B为偏移单位,因此除最后一片外,分片长度应是8B的整数倍
(8)生存时间:设置数据报可以经过的最多路由器数。
(9)协议类型:指出此IP数据报的最高层协议类型。常用的有1表示ICMP,2表示IGMP,6表示TCP,8表示EGP,17表示UDP,41表示IPv6,89表示OSPF
(10)头部校验和:IP数据报头部校验和采用网际校验和算法:发送端先把校验和字段置0,然后将头部划分为长度为16位的比特序列,对头部中每个16位进行二进制反码求和,结果存在检验和字段中。
(11)源IP地址:发送数据报的源主机IP地址
(12)目的IP地址:接收数据报的目的主机的IP地址
(13)选项域:长度范围为0~40B,主要用于支持纠错、测量及安全等措施
(14)填充域:当IP报头长度不是4B的整数倍时,必须利用填充域“添0”来加以补充。
2、程序流程图
3、部分函数注释
(1) int WSAStart(WORD wVersionRequested,LPWSADATA lpWSAData)
wVersionRequested:指明程序使用的Socket版本,其中高位字节指明副版本,低位字节指明主版本。
lpWSAData:返回请求的Socket的版本信息。
返回值:成功返回0,失败返回WSASYSNOTREADY / WSAVERNOTSUPPORTED /
(2)SOCKET sock;
sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,0);
AF_INET:指明通信发生的域为Internet协议簇
SOCK_RAW:指明套接字的类型为原始套接字。套接字分为流式套接字、数据报套接字、流式套接字。
IPPROTO_IP:指定套接字所用的特定协议为IP协议
返回值:成功返回套接字描述符,失败返回INVALID_SOCKET
(3)int bind(int sockfd,struct sockaddr* my_addr,int addrlen)
sockfd:套接字描述符
my_addr:特定的网络地址
addrlen:my_addr的长度
返回值:正确返回0,失败返回SOCKET_ERROR
(4)int recv(int fockfd,char* buff,int len,int flag)
fockfd:套接字描述符
buff:指向接收缓冲区
len:缓冲区的长度
flag:指明调用的方式,一般置0
返回