【问题标题】:Get IP address from socket descriptor?从套接字描述符获取IP地址?
【发布时间】:2013-01-20 14:35:07
【问题描述】:

我打开了一个 TCP 套接字服务器(我省略了一些东西,它取自 here

sockfd = socket(p->ai_family, p->ai_socktype,
            p->ai_protocol))

是否可以从 sockfd 获取服务器的 IP 地址?如果不是,我应该去哪里看?

编辑:我想知道服务器的地址(这是在任何客户端连接之前)。

【问题讨论】:

  • IP哪一端的地址?是您自己,还是您连接的地方?还是两者兼有?!
  • 此套接字未连接,因此无法获取地址。在accept 之后,getsockname 会有所帮助。
  • accept() 本身(可选)返回连接的对等方的地址(请参阅man accept)。
  • 成功调用socket()返回的值没有连接到任何客户端,也没有绑定到任何接口,因此没有可以确定的客户端IP地址和服务器端IP地址在任何地方形成。
  • 如果p 不是NULL,则紧接在for() 循环之后的IP 地址是p->ai_addr, p->ai_addrlen。这仅仅是因为这就是代码binds 的套接字。

标签: c sockets network-programming ip


【解决方案1】:

如果你想知道谁在你的套接字的另一端,你可以在 Linux 中使用getpeernamegetsockname 会告诉你你是谁。不过,您可以在bind 时间决定您希望服务器最初位于哪个地址。

您可能还会发现这个 SO 问题很有用:bind socket to network interface

还有 W. Richard Stevens 所著的“Unix Network Programming, vol 1”一书。

【讨论】:

    【解决方案2】:

    您不能在客户端连接之前使用套接字来获取服务器的地址,因为它是未知的。

    原则上,一个主机可以有多个 IP。用于连接到服务器的 IP 是属于接口的 IP,连接通过该接口到达。在连接到达之前,它是未知的。
    即使您只有一个 IP,连接也可能来自机器内部,在这种情况下,地址将是 127.0.0.1

    所以监听套接字没有关于 IP 的信息。
    您需要找到机器有哪些接口,以及它们的 IP 是什么。

    【讨论】:

    • 这只是部分的,即在使用INADDR_ANY 调用bind() 的特殊情况下。查看 Davide Berra 给出的正确答案。
    • @alk,我想如果他用特定地址打电话给bind(),他就不会问它是什么地址。
    【解决方案3】:

    服务器的地址由你决定。

    取决于传递给bind()函数的参数。

    您可以指定single ip 或将您的套接字绑定到主机的每个地址。​​

    Bind man page

    【讨论】:

      【解决方案4】:

      服务器的地址是传递给bind()的成功调用的地址(如您链接的源代码所示)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多