inet_ntop在第一次使用时返回0.0.0.0

时间:2013-09-20 11:29:34

标签: c linux ip posix inet-ntop

我正在尝试编写服务器应用程序。我想得到客户的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移动到外部函数时,它只适用于来自localhost的连接。感谢。

编辑:

固定。问题是 cli_len 未初始化,因此接受未填充 client_addr

这条线的工作就像一个老板:

socklen_t cli_len=sizeof(struct sockaddr);

1 个答案:

答案 0 :(得分:2)

我找不到问题,但是我发现你已经给了cli_len作为参数,但你必须使用sizeof(ip)来代替inet_ntop的第4个参数(cli_len)。还请在调用inet_ntop之前检查cli_len