【问题标题】:How to detemine which network interface (ip address) will be used to send a packet to a specific ip address?如何确定将使用哪个网络接口(IP 地址)将数据包发送到特定 IP 地址?
【发布时间】:2011-01-26 19:28:42
【问题描述】:

我正在编写一个 SIP 堆栈,我需要在消息中插入一个 IP 地址。该地址必须是用于发送消息的地址。我知道目标 IP 并且需要确定将用于发送消息的 NIC(其地址)......

【问题讨论】:

  • 哪个操作系统?如果您连接到多个 NIC,并且不使用 TCP/IP 或 UDP 等支持在发送数据之前绑定到特定 NIC 的传输,则没有可靠的方法来确定将使用哪个确切的 NIC,因为可能不止一个取决于DNS路由等。在 Windows XP 及更高版本上,您可以使用 GetBestInterfaceEx() 来猜测最有可能使用哪个 NIC。
  • 此回复stackoverflow.com/a/29500867/121961 解决了多个平台的问题

标签: sockets ip-address sip


【解决方案1】:

为了扩展 Remy Lebeau 的评论,GetBestInterfaceEx() 是您最好的选择,如果您使用的是 Windows XP 或更新版本。这适用于 IPv4 和 IPv6 地址。

GetBestInterface/GetBestInterfaceEx 返回用于联系某个地址的最合适接口的索引(称为 IDX)。

然后,您可以通过使用GetIpAddrTableGetAdaptersAddresses 获取接口IP 地址映射来将该索引映射到本地IP 地址,如果您是双栈(同时支持IPv6 和IPv4)。

遍历该表并找到与 IDX 匹配的 dwIndex(或 IfIndex,在 GetAdaptersAddresses 的情况下)的接口。

【讨论】:

【解决方案2】:

通常最好将您的 SIP 堆栈将在其上运行的 IP 地址设置为可调整的配置选项。这意味着用户需要设置一个配置选项,但至少你的堆栈会知道它正在运行的 IP 地址。

如果这不可行,那么您可以使用的一种方法是使用 Via 标头中的虚拟值(例如 0.0.0.0)在所有 IP 地址上发送 SIP 请求,并将获得响应的接口设置为默认值一。这种方法的另一个优点是 SIP 响应会告诉您收到请求的公共 IP 地址,如果您的 SIP 堆栈位于 NAT 之后,这将很有用。

【讨论】:

  • 一切正常,我使用了 IP 配置选项,但我希望堆栈在我有两个 NIC 连接到两个子网时运行...堆栈应该使用特定地址,具体取决于在目标子网上......
  • 听起来你的问题更像是“有没有办法让操作系统告诉你它将从目标 IP a.b.c.d 发送哪个 IP 地址”。我建议在一个单独的问题中提出这个问题,但据我所知,答案是 Windows 和 Linux 除了解析路由和 ifconfig 命令的输出以及进行 sime 笨重的子网匹配之外不提供调用。
【解决方案3】:

通过 TCP,我想你可以在 connect() 之后获取套接字本地端的地址。我不知道 UDP 是否也是如此(我怀疑不是),但可能值得一试。

【讨论】:

    【解决方案4】:

    套接字将允许您在调用连接之前绑定到本地端点(UDP 和 TCP)。

    如果您知道端口,那就没问题了。但是,如果您希望端口是临时的(例如,一些随机端口号),那么您必须提出自己的算法来执行此操作,并使用健壮的代码来处理端口被另一个应用程序独占使用的情况。

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 2013-02-27
      相关资源
      最近更新 更多