c-数据包套接字未接收数据



我有以下C代码,它应该等待以太网设备eth0上的任何数据包,包括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

最新更新