为什么我的IP地址[]被覆盖?

时间:2011-06-25 22:08:13

标签: c linux sockets ip-address

我正在尝试编写服务器/客户端代码,一切正常,除非我尝试存储传入和传出连接的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地址。 问题是什么?

2 个答案:

答案 0 :(得分:4)

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不是)。

答案 1 :(得分:2)

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