【问题标题】:Why is my ip_address[] being overwritten?为什么我的 ip_address[] 被覆盖?
【发布时间】:2011-09-22 18:36:40
【问题描述】:

我正在尝试编写服务器/客户端代码并且一切正常,除非我尝试存储传入和传出连接的 IP 地址。

getpeername(new_fd[client],(struct sockaddr*) &client_addr[client],&addr_size);
ip_address[client] = inet_ntoa(client_addr[client].sin_addr);

在这种情况下,当建立连接时,每个索引的内容都会更改为最近建立的连接。因此 ip_address[] 的每个单元格都将包含最新连接的 IP 地址。 可能是什么问题?

【问题讨论】:

    标签: c linux sockets ip-address


    【解决方案1】:

    inet_ntoa 通常看起来像这样:

    char *
    inet_ntoa(struct in_addr ina)
    {
        static char buf[some_size];
        /* a series of sprintfs */
        return bufl
    }
    

    这意味着每次调用buf 的内容都会被重写。显然不能直接使用inet_ntoa的返回值;你必须使用memcpy 或类似的东西。

    真正的解决方案

    请改用inet_ntop。它更新,支持 IPv6 开箱即用,应该是线程安全的(哦,是的,inet_ntoa 不是)。

    【讨论】:

      【解决方案2】:

      inet_ntoa 不分配。它返回一个静态缓冲区。如果要保留字符串,则需要将其复制到自己的存储中。

      【讨论】:

      • man 中明确说明:“inet_ntoa() 在静态缓冲区中返回点和数字字符串,每次调用函数都会覆盖该缓冲区。”
      猜你喜欢
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多