2

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

4

4 回答 4

3

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

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

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

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

于 2010-06-21T10:55:01.487 回答
1

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

于 2010-06-21T12:35:36.747 回答
1

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

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

于 2010-03-13T23:23:14.207 回答
0

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

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

于 2010-09-21T00:02:23.057 回答