我正在使用Linux(Debian)和C.
我已经使用以下函数打开了接口 - eth0和eth1的套接字:
// Opening the socket
mSocket = socket(device->ifa_addr->sa_family, SOCK_RAW | SOCK_NONBLOCK,
htons(ETH_P_ALL));
if (mSocket == -1)
{
throw CException("socket is bad");
}
// Adding flag to the socket to work only on a specific interface
if (setsockopt(mSocket, SOL_SOCKET, SO_BINDTODEVICE,
(void *) &mIfreq, sizeof(mIfreq)) < 0)
{
throw CException(
"Failed to add binding to specific interface flag");
}
而ifreq保存接口名称:
strncpy(mIfreq.ifr_ifrn.ifrn_name,device->ifa_name, IF_NAMESIZE);
我接下来要做的是使用以下代码接收数据包:
recvSize = recvfrom(mSocket, buffer, ETH_FRAME_LEN, 0, NULL,
NULL);
问题:
1) 为什么如果两个接口都没有连接到任何非套接字都可以打开
2)* 为什么(WLOG)如果eth0连接而eth1不连接,我可以为每个人打开套接字
2.1)* 为什么通过从eth1套接字读取我得到eth0中收到的所有数据包
(wireshark on eth1 isn't showing any packet as it should be)
[我的猜测 - 它是linux故障吗?(在我背后做事吗?)]
提前致谢,
绝望
1 回答
假设你想像Wireshark那样捕获原始数据 .
socket(7)明确指出
SO_BINDTODEVICE
不适用于数据包套接字 . 您应将bind
套接字设置为sockaddr_ll
类型地址,并将sll_ifindex
字段设置为接口编号(有关详细信息,请参阅packet(7)) . 可以使用SIOCGIFINDEX
ioctl
(参见netdevice(7))从其名称(如"eth0")获取接口编号 .