繁体   English   中英

获取相关的本地IP地址/接口以发送到特定服务器

[英]Get relevant local IP address/interface for sending to a specific server

我需要在建立之前获取将用于tcp连接的本地IP地址(与SIP的INVITE消息中的联系人相当)。 初始消息必须包含我的IP地址,使用的库在打开连接之前需要完整的消息。

假设服务器有10.0.13.115,我的客户端有这些IP地址:

  • 10.0.14.33 - VPN,此地址是要使用的地址
  • 172.16.5.99 - 本地网络
  • 192.168.75.66 - 虚拟机,虚拟PC,VMWare等的桥接

除了打开(虚拟)连接到服务器以获取本地接口之外,是否有(简单)方法获取10.0.14.33?

编辑:感谢您的答案到目前为止。 我既不能改变服务器也不能改变协议,所以我真的需要客户端的地址。 我将检查是否可以更改网络库。

我希望有可能因为OS /网络堆栈也需要弄清楚信息......

通过查询本地路由表和接口的最简单,最简单的方法是:

connect() UDP套接字到目标,并使用getsockname()学习本地地址。 由于它是一个UDP套接字,实际上没有任何地方发送。

如果您发送的消息是通过您建立的同一TCP连接,则不需要这样,因为您自然可以建立TCP连接,使用getsockname()获取本地地址,在第一个“消息”中使用该地址你通过那个连接发送。

也许在你的情况下是不可能的,但是:服务器在建立连接时会知道IP地址,因此它更像是元数据而不是内容。 获取发件人IP地址应该不是什么大问题。

只需通过UDP套接字连接(也可能是TCP),通过读取地址

int getsockname(int sockfd, struct sockaddr *addrsocklen_t *" addrlen );

并使用这个。

来自linux手册页

getsockname()在addr指向的缓冲区中返回套接字sockfd绑定的当前地址。 应该初始化addrlen参数以指示addr指向的空间量(以字节为单位)。 返回时它包含套接字地址的实际大小。 如果提供的缓冲区太小,则截断返回的地址; 在这种情况下,addrlen将返回一个大于提供给调用的值。

回报价值

成功时,返回零。 出错时,返回-1,并正确设置errno。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM