【问题标题】:Sockets - How to find out what port and address I'm assigned套接字 - 如何找出分配给我的端口和地址
【发布时间】:2011-05-02 02:09:09
【问题描述】:

我无法解决这个问题 - 我正在使用本指南在 C 中使用套接字 - http://binarii.com/files/papers/c_sockets.txt

我正在尝试使用以下方式自动获取我的 ip 和端口:

server.sin_port = 0;              /* bind() will choose a random port*/
server.sin_addr.s_addr = INADDR_ANY;  /* puts server's IP automatically */
...
...
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function

绑定成功后,如何知道我实际分配了哪些 IP 和端口?

【问题讨论】:

  • 实际上,当你指定INADDR_ANY 时发生的事情并不是它自动放入服务器的IP,它所做的是找到所有接口,并绑定到每个接口。因此,您的问题有很多正确答案。
  • 嗯 - 谢谢你。我正在处理的一项任务要求我使用指定的代码自动获取 IP 和端口,但我要在屏幕上打印客户端连接的服务器地址和端口。这就是我试图弄清楚该怎么做。如果我使用 sockaddr 结构,我只会得到 0.0.0.0 和端口 0。
  • 实际上它并没有“绑定到它们中的每一个”。它不绑定到其中的任何。相反,它告诉堆栈表现得好像它被绑定到所有。这就是为什么它被称为 INADDR_ANY。

标签: c sockets tcp


【解决方案1】:

您的代码中的注释是错误的。 INADDR_ANY 不会自动放置服务器的 IP。它本质上是 0.0.0.0,原因在 mark4o 的 answer 中解释。

【讨论】:

    【解决方案2】:

    如果是服务器套接字,则应在套接字上调用listen(),然后调用getsockname() 以查找它正在侦听的端口号:

    struct sockaddr_in sin;
    socklen_t len = sizeof(sin);
    if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1)
        perror("getsockname");
    else
        printf("port number %d\n", ntohs(sin.sin_port));
    

    至于 IP 地址,如果您使用INADDR_ANY,那么服务器套接字可以接受到任何机器 IP 地址的连接,并且服务器套接字本身没有特定的 IP 地址。例如,如果您的机器有两个 IP 地址,那么您可能会在此服务器套接字上获得两个传入连接,每个连接都有不同的本地 IP 地址。您可以在特定连接的套接字上使用getsockname()(您从accept() 获得),以找出该连接上使用的本地IP 地址。

    【讨论】:

    • 感谢 mark4o - 效果很好!但我仍然无法获取地址 - 我仍然得到 0.0.0.0 - 有什么想法吗?谢谢!
    • 服务器socket没有具体的IP地址,机器可能有多个IP地址。如果您只想获取其中一台机器的地址,请查看另一个问题:stackoverflow.com/questions/212528/…
    • 感谢您提供此代码示例。如果有人对 sock 是什么感到困惑,那就是套接字的文件描述符。
    • UDP 怎么样:如果我在分配了端口0 的套接字上发送,我如何才能找出发送端口号实际上是什么? (与 TCP 不同)
    • 请注意,您不必实际调用listen,这应该适用于 TCP 和 UDP 套接字,只要它们首先绑定即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2020-07-25
    • 1970-01-01
    相关资源
    最近更新 更多