【问题标题】:getsockname always returning 0.0.0.0?getsockname 总是返回 0.0.0.0?
【发布时间】:2011-04-22 19:04:57
【问题描述】:

这里是代码。它与这个类似问题的代码相同:http://monkey.org/freebsd/archive/freebsd-stable/200401/msg00032.html。当我运行它时,我总是得到输出:

收听 0.0.0.0:54493 或其他内容。显然端口发生了变化,但我不知道为什么我一直得到一个 0.0.0.0 的 IP 地址。我错过了什么吗?

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    int sock;
    int len = sizeof(struct sockaddr);
    struct sockaddr_in addr, foo;

    if((sock=socket(AF_INET, SOCK_STREAM, 0))<0)
    {
        exit(0);
    }

    memset(&addr, 0, sizeof(struct sockaddr_in));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(0);

    if(bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in))<0)
    {
        perror("bind");
        exit(0);
    }

    if(listen(sock, 5)<0)
    {
         perror("listen");
         exit(0);
    }

    getsockname(sock, (struct sockaddr *) &foo, &len);
    fprintf(stderr, "listening on %s:%d\n", inet_ntoa(foo.sin_addr), 
            ntohs(foo.sin_port));

    return 0;
}

【问题讨论】:

    标签: c sockets networking


    【解决方案1】:

    您指定 INADDR_ANY 而不是特定的 IP 地址,因此它绑定到通配符(所有接口)0.0.0.0。因此,当您致电 getsockname() 时,您将得到回复。

    如果您将0.0.0.0 指定为IP 地址而不是INADDR_ANY,您将获得相同的行为;您将绑定到机器上的所有网络接口。

    例如,假设您只有一个分配有 IP 192.168.1.12 的网络接口。默认情况下,您也有环回 - 127.0.0.1

    使用0.0.0.0INADDR_ANY 意味着您将被绑定到这两个地址,而不是一个特定的地址。您将能够通过任一 IP 连接到您的进程。

    如果您要绑定到特定 IP 而不是 INADDR_ANY,则您的进程将只侦听该 IP,并且您将使用 getsockname() 取回该特定 IP。

    【讨论】:

    • 那么如何指定不想要 0.0.0.0?
    【解决方案2】:

    是的,如果你将它绑定到一个 LOOPBACK ,你必须指定 INADDR_LOOPBACK。 否则,它将自己附加到 0.0.0.0,它代表所有可用的网络接口。我在发出 getnameinfo() 调用时遇到了同样的问题。

    【讨论】:

      【解决方案3】:

      正如其他答案中提到的,0.0.0.0 被返回,因为INADDR_ANY 被指定为监听套接字的主机地址。如果您认为在多宿主主机中,客户端连接可能会进入这些接口中的任何一个(那么应该报告哪一个?),这是有道理的。

      扩展这些答案;如果需要客户端连接的实际 IP 地址,请使用从 accept() 返回的 SOCKETgetsockname()。这将提供客户端连接的服务器上的接口地址。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 2014-04-15
        • 2012-05-05
        相关资源
        最近更新 更多