【问题标题】:inet_ntop returns 0.0.0.0 in first usageinet_ntop 在第一次使用时返回 0.0.0.0
【发布时间】:2013-09-25 18:39:15
【问题描述】:

我正在尝试编写服务器应用程序。我想获取客户的IP。我的问题是 inet_ntop 函数。我无法让它正常工作。这是我的用法:

void client_loop(uint16_t port) {
     int cfd;
     int socket = bind_socket(port, INADDR_ANY);
     char ip[INET_ADDRSTRLEN];
     struct sockaddr client_addr;
     struct sockaddr_in *addr_in;
     socklen_t cli_len;
     while (work) {
        if ((cfd = TEMP_FAILURE_RETRY(accept(socket, &client_addr, &cli_len))) < 0) {
            if (EAGAIN == errno || EWOULDBLOCK == errno)
                continue;
            ERR("accept");
       }
       addr_in=(struct sockaddr_in *)&client_addr;
       inet_ntop(AF_INET, &(addr_in->sin_addr),ip, sizeof(ip)); 
       printf("INET_NTOP: %s\n",ip);
    }
}

第一次使用inet_ntop 总是返回0.0.0.0 然后就可以正常工作了。当我将 inet_ntop 移动到外部函数时,它仅适用于来自本地主机的连接。谢谢。

编辑:

已修复。问题是 cli_len 没有初始化,所以 accept 没有填充 client_addr

有了这条线,它就像老板一样工作:

socklen_t cli_len=sizeof(struct sockaddr);

【问题讨论】:

  • 调试器对addr_in的内容说了什么?
  • 地址 0.0.0.0 表示套接字正在侦听所有地址。像 127.0.0.1 这样的特定地址意味着服务器只监听该地址,而不监听其他任何地址。

标签: c linux ip posix inet-ntop


【解决方案1】:

我找不到问题,但我看到您已将 cli_len 作为参数,但您必须使用 sizeof(ip) 代替 inet_ntop 的第 4 个参数 (cli_len)。并且请在调用 inet_ntop 之前检查 cli_len

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2020-06-21
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多