如何确定Linux套接字在C ++中绑定的接口

时间:2013-10-09 00:55:23

标签: c++ linux sockets

我一直试图解决这个问题。给定一个Linux套接字,我该怎么办

  1. 确定它是否已绑定?
  2. 如果绑定,请确定它在多宿主系统上绑定到哪个网络接口子集?
  3. 简而言之,我有一台带有多个网卡的机器和一个仅绑定到这些卡子集的套接字。我想以编程方式检测并记录这些接口,因为它们已被绑定在我们库中的其他位置,这意味着我在绑定时无法访问此信息。

    我还应该指出,我需要一个兼容IPV4 / 6的解决方案,因为它适用于SCTP套接字(尽管我现在对UDP或TCP解决方案很好)

1 个答案:

答案 0 :(得分:2)

getsockname函数返回套接字名称,即本地套接字地址。只需为未绑定和绑定套接字调用此函数,以确定套接字实现行为。

修改: 当您有AF_INET(即IPv4)套接字时,成员sin_addr.S_un.S_addr与您传递给SOCKADDR_IN函数的bind结构中的相应成员相同。因此,如果您已绑定到INADDR_ANY,则当套接字未绑定到特定网络适配器时,您将获得INADDR_ANY

我用我的操作系统的socket实现(Windows 7)检查了这一点。如果您的实现返回其他内容,您可能会遇到由其他地方的错误导致的未定义行为。当然,如果您有可用的源代码,您可以验证网络堆栈的实现。

不支持绑定到网络适配器的子集。您只能绑定到一个或所有。