【问题标题】:Linux C Sockets - Binded socket receives packets from another interface?Linux C 套接字 - 绑定套接字从另一个接口接收数据包?
【发布时间】:2013-12-19 13:31:24
【问题描述】:

我正在使用 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*) 如果 eth0 已连接而 eth1 未连接,为什么 (WLOG) 我可以打开每个套接字的套接字

2.1*) 为什么通过从 eth1 套接字读取我得到了在 eth0 中接收到的所有数据包

(eth1 上的wireshark 没有显示任何应有的数据包)

[我的猜测 - 是 linux 的错吗?(在我背后做事?)]

提前致谢,

绝望

【问题讨论】:

  • mIfreq 包含什么?它是如何定义的?
  • throw CException(...) 和使用 C 是如何结合在一起的?
  • ifreq 仅使用 ETH0/1 名称初始化。
  • @glglgl 如果我将 C 库与 C++ 异常库一起使用会有所不同吗?在这里学习,谢谢!
  • @Despair 这有什么帮助?你没有办法抛出异常。

标签: c linux sockets interface packet


【解决方案1】:

假设您想像 Wireshark 一样捕获原始数据。

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

【讨论】:

  • 您好,感谢您的回复。当我尝试使用该索引进行绑定时,我得到了包含 mIfreq.ifr_ifru.ifru_ivalue 的 ifaddr 结构,但出现了无效参数失败。我错过了任何参数吗?
  • sockaddr_ll addr; addr.sll_family=AF_PACKET; addr.sll_ifindex=mInterfaceIndex; //2 if(bind(mSocket,(sockaddr*)&amp;addr,sizeof(sockaddr))&lt;0) { perror("Bind"); }
  • 您可能应该将其余字段清零。 sockaddr_ll addr = { 0 };
  • ok 找到了问题。应该是sizeof(sockaddr_ll) ...现在eth0(连接的那个)只得到数据包现在的问题是即使在将它连接到第三个ping设备之后我也没有在断开的接口上得到任何东西。 (wireshark 向他们展示)有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 2012-10-25
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 2017-09-15
相关资源
最近更新 更多