首页 文章

Linux C套接字 - Binded套接字从另一个接口接收数据包?

提问于
浏览
0

我正在使用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 回答

  • 4

    假设你想像Wireshark那样捕获原始数据 .

    socket(7)明确指出 SO_BINDTODEVICE 不适用于数据包套接字 . 您应将 bind 套接字设置为 sockaddr_ll 类型地址,并将 sll_ifindex 字段设置为接口编号(有关详细信息,请参阅packet(7)) . 可以使用 SIOCGIFINDEX ioctl (参见netdevice(7))从其名称(如"eth0")获取接口编号 .

相关问题