小编Dir*_*irk的帖子

Linux下C/C++中的数据包嗅探器

我尝试在 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)

c c++ sockets linux raw-sockets

2
推荐指数
1
解决办法
8953
查看次数

标签 统计

c ×1

c++ ×1

linux ×1

raw-sockets ×1

sockets ×1