getsockname总是返回0.0.0.0?

13 c sockets networking

这是代码.它与此类似问题的代码相同: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;
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ach 23

您指定的INADDR_ANY不是特定的IP地址,因此它绑定到通配符(所有接口)0.0.0.0.所以,当你打电话getsockname()的时候就是你得到的.

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

例如,假设您只有一个网络接口,192.168.1.12并为其分配了IP .你也有默认的环回 - 127.0.0.1

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

如果您要绑定到特定的IP而不是INADDR_ANY,那么您的进程只会侦听该IP,并且您将获得该特定的IP getsockname().

  • 那你怎么指定你不想要0.0.0.0? (2认同)