如何确定将使用哪个网络接口(IP地址)将数据包发送到特定的IP地址?

时间:2010-03-12 12:00:47

标签: sockets ip-address sip

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

4 个答案:

答案 0 :(得分:3)

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

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

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

迭代该表,找到与IDX匹配的dwIndex(或者GetInaptersAddresses的IfIndex)接口。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

如果您知道端口,那就没关系了。但是,如果您希望端口是短暂的(例如一些随机端口号),那么您必须提出自己的算法来执行此操作,并使用强大的代码来处理端口被其他应用程序专门占用的情况。