【问题标题】:Prevent from getpeername() to return 127.0.0.1防止 getpeername() 返回 127.0.0.1
【发布时间】:2013-01-07 12:29:34
【问题描述】:

我有一个服务器 (A) 和一个客户端 (B),用 C 编写,在同一台 Linux 机器上运行。 服务器将一个端口绑定到 INADDR_ANY,客户端将另一个端口绑定到 INADDR_ANY。 当另一个运行在另一个 Linux 机器上的客户端(C)连接到服务器时,我希望服务器获取客户端 B 的 IP 地址并将其发送给客户端 C。

当我从服务器使用 getpeername() 时,它返回正确的“127.0.0.1”,但我无法将此地址发送给客户端 C-它将无法连接到客户端 B那个地址。

有没有什么聪明的方法可以获取客户端 B 的实际 IP? 如果它更容易一些,我可以让每个客户端将它的 IP 发送到服务器。

谢谢!

【问题讨论】:

    标签: c linux sockets tcp


    【解决方案1】:

    使用getifaddrs() 获取接口IP 地址,手册页中有一个示例。请注意,您可以发送任何接口的 IP 地址,因为服务器使用INADDR_ANY 绑定,因此它侦听所有接口。来自男人ip(7)

    当绑定调用中指定了 INADDR_ANY 时,套接字将 绑定到所有本地接口。

    如果您想要公共 IP 地址,请参考以下问题:

    Get public/external IP address?

    【讨论】:

    • mux- getifaddrs() 的问题是一台计算机可以有多个 IP 地址,所以我无法捕获不是 127.0.0.1 的第一个 IP。
    • @bomba6 我认为任何人都会这样做,因为服务器绑定到INADDR_ANY,它侦听所有接口,因此它会接收数据包。
    • 感谢您的澄清。但是,客户端 C 位于(另一个)网络上的另一台计算机上。我没有返回“内部”IP 地址的风险?
    • @bomba6 是的,它返回内部 IP 地址,简而言之,您需要连接到 whatismyip.org 等服务,详情请参阅链接问题。
    【解决方案2】:

    您真正想知道的是接口的 IP 地址,该地址将用于路由到客户端 C。
    使用 Linux 命令行,您可以这样做(假设 C 为 10.0.0.1):

    # ip route show match 10.0.0.1
    default via 20.0.0.2 dev eth0
    # ifconfig eth0
    eth0        Link encap:Ethernet  HWaddr 00:00:00:00:00:00
                inet addr:20.0.0.3  Bcast:20.0.0.255  Mask:255.255.255.0
    

    在这种情况下,您需要使用20.0.0.3

    问题仍然是如何在 C 中获得所有这些。 一种方法是连接到 C 上的某个服务,然后在生成的套接字上运行 getsockname

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2014-03-26
      • 2014-12-21
      • 2013-10-19
      • 1970-01-01
      相关资源
      最近更新 更多