1

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

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

  • 10.0.14.33 - VPN,这个地址是要使用的地址
  • 172.16.5.99 - 本地网络
  • 192.168.75.66 - virtualbox、virtualPC、VMWare 等的桥接。

除了打开与服务器的(虚拟)连接只是为了使用本地接口之外,是否有一种(简单的)方法来获取 10.0.14.33?

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

我希望有一种可能性,因为操作系统/网络堆栈也必须找出信息......

4

3 回答 3

2

The easiest, bar going through hoops of querying the local routing table and interfaces is:

connect() an UDP socket to the destination, and learn the local address with getsockname(). Since it's an UDP socket, nothing is actually sent anywhere.

If the message you're sending is over the same TCP connection you establish, this is not needed though, as you naturally can just establish the TCP connection, get the local address with getsockname(), use that address in the first "message" you send over that connection.

于 2013-06-07T09:58:59.873 回答
1

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

于 2013-06-07T09:58:52.023 回答
0

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

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

并使用它。

来自linux 手册页

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

返回值

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

于 2013-06-07T10:04:46.417 回答