原始套接字-解析MAC数据包
原始套接字.c
套接字类型
原始套接字
1、一种不同于SOCK_STREAM、SOCK_DGRAM的套接字,它实现于系统核心
2、可以接收本机网卡上所有的数据帧(数据包),对于监听网络流量和分析网络数据很有作用
3、开发人员可发送自己组装的数据包到网络上
4、广泛应用于高级网络编程
5、网络专家、黑客通常会用此来编写奇特的网络程序
流式套接字只能收发
TCP协议的数据
数据报套接字只能收发
UDP协议的数据
原始套接字可以收发
1、内核没有处理的数据包,因此要访问其他协议
2、发送的数据需要使用,原始套接字(SOCK_RAW)
标准套接字最多只能访问传输层的协议,如果应用层用的是原始套接字的话,不仅能到达传输层,也能到达网络层,链路层,然后自己去组装和封装对应的协议,原始套接字是较为底层的套接字类型。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ether.h>
#include <arpa/inet.h>#define ERR_LOG(errmsg) \do \{ \perror(errmsg); \exit(1); \} while (0)int main(int argc, char const *argv[])
{// 创建原始套接字int sockfd;if ((sockfd = socket(AF_INET, SOCK_RAW, htons(ETH_P_ALL))) < 0){ERR_LOG("socket error");}// 接收数据并分析unsigned char buf[1024] = {0};while (1){// 接收if (recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL) < 0){ERR_LOG("recvfrom error");}// 分析接收到的数据包unsigned char dst_mac[6] = {0};unsigned char src_mac[6] = {0};unsigned short type = 0;sprintf(dst_mac, "%X:%X:%X:%X:%X:%X", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);sprintf(src_mac, "%X:%X:%X:%X:%X:%X", buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12]);type = ntohs(*(unsigned short *)(buf + 12));printf("dst_mac:%s\n", dst_mac);printf("src_mac:%s\n", src_mac);}return 0;
}