我一直试图弄清楚这一点。给定一个 Linux 套接字,我怎么能
- 确定是否绑定?
- 如果已绑定,请确定它绑定到多宿主系统上的哪个网络接口子集?
简而言之,我有一台带有多个网卡的机器和一个仅绑定到这些卡子集的套接字。我想在这些接口被绑定后以编程方式检测并记录它们,这意味着我在绑定时无法访问这些信息。
我还应该指出,我需要一个兼容 IPV4/6 的解决方案,最好能与 SCTP 套接字一起使用(尽管我现在可以使用 UDP 或 TCP 解决方案)
getsockname函数返回套接字名称,即本地套接字地址。只需为未绑定和绑定套接字调用此函数即可确定您的套接字实现行为。
编辑:当您有一个 AF_INET(即 IPv4)套接字时,该成员与您传递给该函数sin_addr.S_un.S_addr
的结构中的相应成员相同。因此,如果您已绑定到套接字,则当套接字未绑定到特定的网络适配器时。SOCKADDR_IN
bind
INADDR_ANY
INADDR_ANY
我用我的操作系统(Windows 7)的套接字实现检查了这一点。如果您的实现返回其他内容,您可能会遇到由其他地方的错误引起的未定义行为。当然,如果您有可用的源代码,您可以验证网络堆栈的实现。
不支持绑定到网络适配器的子集。您只能绑定到一个或全部。