数据包套接字未接收数据
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
我有以下 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