我正在写一个SIP堆栈,我需要在消息中插入一个ip地址。该地址必须是用于发送消息的地址。我知道目标IP并需要确定将用于发送消息的NIC(其地址)....
答案 0 :(得分:3)
为了扩展Remy Lebeau的评论,GetBestInterfaceEx()是您最好的选择,如果您使用的是Windows XP或更新版本。这适用于IPv4和IPv6地址。
GetBestInterface / GetBestInterfaceEx返回用于联系某个地址的最合适接口的索引(称之为IDX)。
然后,如果您使用双层堆叠(支持IPv6和IPv4),则可以使用GetIpAddrTable或GetAdaptersAddresses获取接口< - > 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)之前绑定到本地端点。
如果您知道端口,那就没关系了。但是,如果您希望端口是短暂的(例如一些随机端口号),那么您必须提出自己的算法来执行此操作,并使用强大的代码来处理端口被其他应用程序专门占用的情况。