数据包套接字未接收数据

packet socket not receiving data

我有以下 C 代码,应该等待以太网设备 eth0 上的 any 数据包,包括 IPv6 多播消息。

我在这里使用 packet(7) 套接字,因为我的底层代码正在处理层。因此,我想接收该套接字上的所有数据包。

与另一台主机的通信是通过两个 IPv6 来回多播消息和随后的基于 TCP 的通信建立的。

#include <sys/socket.h>
#include <linux/if_packet.h>
#include <netinet/if_ether.h>
#include <stdio.h>
#include <string.h>

int main(void) {
    int fd = socket(AF_PACKET, SOCK_RAW, 0);
    if (fd < 0)
    {
        perror("cannot open socket");
    }

    struct sockaddr_ll sll;
    memset(&sll, 0, sizeof(sll));
    sll.sll_family   = AF_PACKET;
    sll.sll_ifindex  = if_nametoindex("eth0");
    sll.sll_protocol = ETH_P_ALL;

    if (bind(fd, (struct sockaddr*)&sll, sizeof(sll)) < 0)
    {
        perror("cannot bind socket to device");
        return 1;
    }

    while(1) {
        char *recvBuf[1518];
        struct sockaddr_ll saddr;
        socklen_t saddr_size = sizeof(saddr);

        size_t len = recvfrom(fd, recvBuf, 1518, 0, (struct sockaddr*)&saddr, &saddr_size);

        // PRINTOUT HERE
    }

    close(fd);

    return 0;
}

我在我的 debian 机器上这样编译:

gcc my_sniffer.c -o test.bin
setcap 'cap_net_admin,cap_net_raw+ep' ./test.bin
./test.bin

二进制文件启动。但是,没有收到数据包。

运行 tcpdump -i eth0 -w test.pcap,在收到的 IPv6 多播消息中产生。

我在这里错过了什么?码没了?使用了错误的插座?

这一行:

sll.sll_protocol = ETH_P_ALL;

您忘记使用 htons