我正在尝试编写服务器/客户端代码,一切都正常工作,但当我尝试存储传入和传出连接的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地址。问题会是什么呢?
发布于 2011-06-26 06:17:49
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不是)。
发布于 2011-06-26 06:10:22
inet_ntoa不分配。它返回一个静态缓冲区。如果您想保留字符串,则需要将其复制到您自己的存储中。
https://stackoverflow.com/questions/6480822
复制相似问题