我尝试在 linux 下使用原始套接字捕获网络数据包。
这有时有效。似乎我可以捕捉到一些对话,但不是全部。
我创建了一个套接字:
sock = socket( PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
Run Code Online (Sandbox Code Playgroud)
然后我通过以下方式将其绑定到 eth0:
struct sockaddr_ll sll;
struct ifreq ifr;
memset( &sll, 0, sizeof( sll));
memset( &ifr, 0, sizeof( ifr));
strcpy( ifr.ifr_name, "eth0");
if(( ioctl( sock, SIOCGIFINDEX, &ifr))==-1)
{
printf( "error\n");
return(-1);
}
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons( ETH_P_ALL);
bind( sock, (struct sockaddr*)&sll, sizeof( sll));
Run Code Online (Sandbox Code Playgroud)
然后我尝试接收:
int packetsize = 65535;
char packet[packetsize];
struct ether_header *eth = (struct ether_header *) packet;
struct iphdr *ip = (struct iphdr *) …Run Code Online (Sandbox Code Playgroud)