我正在编写一个 SIP 堆栈,我需要在消息中插入一个 IP 地址。该地址必须是用于发送消息的地址。我知道目标 IP 并且需要确定将用于发送消息的 NIC(其地址)....
4 回答
为了扩展 Remy Lebeau 的评论,如果您使用的是 Windows XP 或更新版本, GetBestInterfaceEx()是您最好的选择。这适用于 IPv4 和 IPv6 地址。
GetBestInterface/GetBestInterfaceEx 返回用于联系某个地址的最合适接口的索引(称为 IDX)。
然后,如果您是双堆栈(同时支持 IPv6 和 IPv4),则可以使用GetIpAddrTable或GetAdaptersAddresses获取接口<-> IP 地址映射,将该索引映射到本地 IP 地址。
遍历该表并找到与 IDX 匹配的 dwIndex(或 IfIndex,在 GetAdaptersAddresses 的情况下)的接口。
通过 TCP,我认为您可以在 connect() 之后获取套接字本地端的地址。我不知道 UDP 是否也是如此(我怀疑不是),但它可能值得一试。
通常最好允许将您的 SIP 堆栈将在其上运行的 IP 地址设置为可调整的配置选项。这意味着用户需要设置一个配置选项,但至少你的堆栈会知道它正在运行的 IP 地址。
如果这不可行,那么您可以使用的一种方法是使用 Via 标头中的虚拟值(例如 0.0.0.0)在所有 IP 地址上发送 SIP 请求,并将获得响应的接口设置为默认接口。这种方法还有一个优点,即 SIP 响应会告诉您收到请求的公共 IP 地址,如果您的 SIP 堆栈位于 NAT 之后,这将很有用。
套接字将允许您在调用 connect(UDP 和 TCP)之前绑定到本地端点。
如果您知道端口,那就没问题了。但是,如果您希望端口是临时的(例如,一些随机端口号),那么您必须提出自己的算法来执行此操作,并使用健壮的代码来处理端口被另一个应用程序独占使用的情况。