我正在尝试编写服务器/客户端代码,一切正常,除非我尝试存储传入和传出连接的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地址。 问题是什么?
答案 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不分配。它返回一个静态缓冲区。如果要保留字符串,则需要将其复制到自己的存储中。