一、链路层数据格式
mac报文:14个字节
二、IP数据报文格式
三、TCP数据报文格式
四、UDP数据报文格式
五、demo(网络分析器)
recvfrom接收链路层帧数据,不经过网络层、传输层,不会给发送者的地址结构赋值,因此后两个参数为NULL。
设计思路:
①创建一个原始套接字。
②while(1)利用recvfrom不断接收网络数据。
③解析获得mac头部中的源mac和目的mac,并判断网络层的协议类型。
④若是IP报文,则获得源IP和目的IP,并解析获得传输层协议类型。
⑤若传输层为TCP或UDP协议,则解析报文获得数据
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ether.h>
#include <arpa/inet.h>
#include <errno.h>
int main()
{
//1.创建一个原始套接字(ETH_P_ALL表示收发任何数据类型)
int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if(sockfd<0){
perror("socket");
return 0;
}
else{
printf("sockfd=%d\n",sockfd);
}
//2.使用recvfrom接收网络数据(数据多,需要用while)
while(1)
{
//定义buf存放帧数据,大小unsigned char1500
unsigned char buf[1500]="";
int len = recvfrom(sockfd, buf, sizeof(buf), 0, NULL,