【问题标题】:Get relevant local IP address/interface for sending to a specific server获取相关的本地 IP 地址/接口以发送到特定服务器
【发布时间】:2013-06-03 14:11:36
【问题描述】:

我需要在建立 tcp 连接之前获取将用于 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?

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

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

【问题讨论】:

    标签: c++ ip-address


    【解决方案1】:

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

    connect() 到目的地的 UDP 套接字,并使用 getsockname() 学习本地地址。 因为它是一个 UDP 套接字,所以实际上什么都没有发送到任何地方。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        并使用它。

        来自linux man page

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

        返回值

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

        【讨论】:

          猜你喜欢
          • 2011-11-12
          • 1970-01-01
          • 2017-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-26
          • 1970-01-01
          • 2016-10-24
          相关资源
          最近更新 更多