getsockname总是返回0.0.0.0?[英] getsockname always returning 0.0.0.0?

本文是小编为大家收集整理的关于getsockname总是返回0.0.0.0?的处理方法,想解了getsockname总是返回0.0.0.0?的问题怎么解决?getsockname总是返回0.0.0.0?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

这是代码.它与此类似问题的代码相同: http://.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;
}

推荐答案

您指定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.0或INADDR_ANY意味着您将绑定到两个地址,而不是特定的地址.您将能够通过任何一个IP连接到您的过程.

如果要绑定到特定的IP而不是INADDR_ANY,则您的过程只会在该IP上聆听,并且您会使用getsockname().

其他推荐答案

是的,如果将其绑定到环回,则必须指定Inaddr_loopback. 否则,它将自己附加到0.0.0.0,代表所有可用的网络接口.在发出getNameInfo()呼叫时,我面临着同样的问题.

其他推荐答案

如其他答案中提到的,0.0.0.0被返回,因为INADDR_ANY被指定为听力套接字的主机地址.这是有道理的,如果您认为在多个主机中,客户连接可能会在任何这些接口上进行(因此应报告?)

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

本文地址:https://www.itbaoku.cn/post/359118.html