【发布时间】:2019-11-28 21:03:05
【问题描述】:
我有一个绑定到已经处于混杂模式的设备的原始套接字:
int sock = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
if(sock == -1)
{
return -1;
}
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_ifrn.ifrn_name, "eth0", IFNAMSIZ);
if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) < 0)
{
close(sock);
return -2;
}
while(1) {
packet_size = recvfrom(sock , buffer , 65536 , 0 , NULL, NULL);
// packet processing...
}
我的问题是我只在我的套接字上接收 IP 目标与我绑定的设备 (eth0) 的 IP 匹配的数据包。如何接收设备正在接收的所有 TCP 数据包?我可以在 Wireshark 中看到设备上的所有 TCP 数据包,但我在原始套接字中看到的唯一数据包是那些发往设备 IP 的数据包。
【问题讨论】:
-
此代码块:
if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) < 0) { close(sock); return -2; }需要从您的代码中删除,因为ifr结构尚未初始化 -
@user3629249 更新了代码块,很抱歉在复制简化版本的代码时出现错误
-
你不应该也设置数据包掩码吗?看到这个stackoverflow.com/questions/12177708/…和stackoverflow.com/questions/114804/…
-
@TarunLalwani 谢谢,我已经为我感兴趣的特定接口添加了数据包掩码
标签: c linux sockets linux-kernel raw-sockets