我有以下 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多播訊息。
我在這里想念什么?代碼關閉了嗎?使用了錯誤的插座?
uj5u.com熱心網友回復:
在這一行:
sll.sll_protocol = ETH_P_ALL;
你忘了用htons
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/478900.html
