原始套接字

原始套接字-解析MAC数据包

原始套接字.c

套接字类型

原始套接字

1、一种不同于SOCK_STREAM、SOCK_DGRAM的套接字,它实现于系统核心
2、可以接收本机网卡上所有的数据帧(数据包),对于监听网络流量和分析网络数据很有作用
3、开发人员可发送自己组装的数据包到网络上
4、广泛应用于高级网络编程
5、网络专家、黑客通常会用此来编写奇特的网络程序

流式套接字只能收发

TCP协议的数据

数据报套接字只能收发

UDP协议的数据

原始套接字可以收发

1、内核没有处理的数据包,因此要访问其他协议
2、发送的数据需要使用,原始套接字(SOCK_RAW)

Untitled

标准套接字最多只能访问传输层的协议,如果应用层用的是原始套接字的话,不仅能到达传输层,也能到达网络层,链路层,然后自己去组装和封装对应的协议,原始套接字是较为底层的套接字类型。

Untitled

#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;
}

posted @ 2024-06-11 21:57  晖_IL  阅读(4)  评论(0编辑  收藏  举报