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

Sockets 如何确定将使用哪个网络接口(ip地址)向特定ip地址发送数据包?,sockets,ip-address,sip,Sockets,Ip Address,Sip,我正在编写SIP堆栈,需要在消息中插入ip地址。此地址必须是用于发送消息的地址。我知道目标IP,需要确定将用于发送消息的NIC(其地址)…通常最好将SIP堆栈操作的IP地址设置为可调整的配置选项。这意味着用户将需要设置一个配置选项,但至少您的堆栈将知道其操作的IP地址 如果这不可行,那么您可以使用的方法是使用Via头中的虚拟值(如0.0.0.0)在所有IP地址上发送SIP请求,并将收到响应的接口设置为默认接口。这种方法的优点是,SIP响应将告诉您收到请求的公共IP地址,如果您的SIP堆栈位于NA

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

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


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

如果您使用的是Windows XP或更新版本,请详细介绍一下Remy Lebeau的评论。这将适用于IPv4和IPv6地址

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

然后,您可以通过使用或(如果您是双重堆叠(同时支持IPv6和IPv4)获取interfaceIP地址映射,将该索引映射到本地IP地址


迭代该表并找到与IDX匹配的dwIndex(或者如果是GetAdapterAddresses,则为iIndex)接口。

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

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


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

哪个操作系统?如果您连接到多个NIC,并且未使用TCP/IP或UDP之类的传输,这些传输支持在发送数据之前绑定到特定NIC,则无法确定将使用哪个NIC,因为根据DNS路由等,可能有多个NIC是合适的。在Windows XP及更高版本上,您可以使用GetBestInterfaceEx()猜测最有可能使用哪个NIC。此响应解决了多个平台的问题。这一切都没问题,我对IP使用了配置选项,但我希望当两个NIC连接到两个子网时,堆栈可以运行。。。堆栈应该根据目标子网使用特定的地址……听起来您的问题更像是“有没有办法让操作系统告诉您它将从目标IP a.b.c.d发送哪个IP地址?”。我建议在单独的问题中提问,但据我所知,除了解析route和ifconfig命令的输出并进行sime clunky子网匹配外,Windows和Linux不提供这方面的调用。如果您还需要在Linux上运行代码,请使用我的回答: