【发布时间】:2016-03-21 08:58:29
【问题描述】:
使用以下方法使用 AF_PACKET 和环形缓冲区(伪 C)捕获数据包:
// Set up socket
fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
// Set socket bind options
struct sockaddr_ll sll;
sll.sll_family = AF_PACKET
sll.sll_protocol = htons(ETH_P_ALL)
sll.sll_ifindex = 0 // Bind to all interfaces
// Bind socket to all interfaces
bind(fd, (struct sockaddr *) &sll, socklen_t(sizeof(sll)))
// Set tpacket options in tp
setsockopt(fd, SOL_PACKET, PACKET_RX_RING, &tp, socklen_t(sizeof(tp)))
// Map the ring buffer
mmap(NULL, ring_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)
// Read from ring using offsets
...
如上所示,如果sll_ifindex 设置为0,则套接字将在所有接口上接收。有没有办法修改这个方法,或者以某种方式收集数据包到达的网络接口?
【问题讨论】:
-
@JoachimPileborg 我的 C 有点太伪了。我对其进行了编辑以希望使其更清晰。