[英]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?
编辑:感谢您的答案到目前为止。 我既不能改变服务器也不能改变协议,所以我真的需要客户端的地址。 我将检查是否可以更改网络库。
我希望有可能因为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.