原始套接字
原始套接字-解析MAC数据包
套接字类型
原始套接字
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言