【问题标题】:How to fetch the network interface of a socket after binding it to 0.0.0.0 [duplicate]将套接字绑定到 0.0.0.0 后如何获取套接字的网络接口 [重复]
【发布时间】:2020-11-06 11:55:42
【问题描述】:

我有一个绑定到 0.0.0.0 的 UDP 套接字。之后,我如何知道接收数据包的确切网络接口?我试过getsockname,但它返回0.0.0.0。

【问题讨论】:

  • 如果套接字绑定到 0.0.0.0,它不会绑定到特定的网络接口。这意味着您无法获取套接字的接口。您只能获取特定 UDP 数据包进入的接口,但套接字上的下一个数据包可能已经到达不同的接口。要找出数据包进入的接口,请参阅How to tell which interface the socket received the message from?
  • 是的,这行得通。我想要 Windows 和 Linux 上的解决方案。在 Windows 上,还可以通过 WSARecvMsg API 获得 IP_PKTINFO。你的指针有帮助。谢谢。
  • Steffen,是否也可以获取接口类型,即。 eth0 还是 wifi 等?
  • 不是直接的。但是从接口 id 到接口属性是一个不同的问题,应该作为一个新问题来问。
  • 当然,如果没有直接的方法,那就是单独的上下文。同意。

标签: c sockets networking


【解决方案1】:

How can I get to know the IP address for interfaces in C? 有一个很好的代码示例。缩短到你的情况是

#define MAX_INTERFACE_COUNT 10

struct ifconf ifc;
struct ifreq ifr[MAX_INTERFACE_COUNT];

ifc.ifc_len = sizeof(ifr);
ifc.ifc_ifcu.ifcu_buf = (caddr_t) ifr;

if (ioctl(sock, SIOCGIFCONF, &ifc)) {
    printf("Error getting ifconf structure");
    exit(-1);
}

int ifc_num = ifc.ifc_len / sizeof(struct ifreq);
printf("Bound to %d interfaces:\n", ifc_num);

for (int i = 0; i < ifc_num; ++i)
    printf("  %d is '%s'\n", i+1, ifr[i].ifr_name);

我在这里假设sock 是您的套接字句柄,并且您的计算机上的网络接口(硬件和虚拟)不超过MAX_INTERFACE_COUNT

【讨论】:

  • 我的系统上有 2 个接口,一个是环回接口,另一个是以太网接口。上面的代码列出了两者。我希望它只会给我以太网,从我接收数据包的地方。
  • 因为你将你的套接字绑定到0.0.0.0,它从所有接口接收包,甚至是环回接口(见here)。因此,该列表是正确的。如果您不希望输出中的环回,请过滤它,例如if (strcmp(ifr[i].ifr_name," lo "))printf 之前的行中。
  • 所以,如果我的系统上有一个 lo、wifi 和 eth0,并且我在 wifi 接口上收到一个数据包,sn-p 上面会给我 'lo & wifi' 或 'lo & wifi & eth0' ?我没有类似的设置,因此我问。
  • 只有活动接口(不定序)应该被输出,因为只有它们可以接收数据包。如果你的wifi没有连接,可能是这个接口没有输出。试试ifconfig 找出答案。
  • 好的,在这种情况下,我不是在寻找所有活动的接口,而只是在其上接收数据包的接口。 Steffen Ullrich 建议的解决方案适用于这种情况。
猜你喜欢
  • 2013-01-06
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多