c/c++语言开发共享getsockname总是返回0.0.0.0?

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

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

#include  #include  #include  #include  #include  #include  #include  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:%dn", 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.0INADDR_ANY意味着您将绑定到这两个地址,而不是特定地址。 您将能够通过IP连接到您的流程。

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

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

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

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

    需要了解更多c/c++开发分享getsockname总是返回0.0.0.0?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享getsockname总是返回0.0.0.0?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/980515.html

      (0)
      上一篇 2021年12月14日
      下一篇 2021年12月14日

      精彩推荐