我有一台服务器,它应该允许一个客户端一次连接,执行命令然后关闭。服务器保留“当前连接的”IP地址的数组列表,以便它知道接受命令的人。 问题是我有两个运行在类似IP地址上的客户端被视为同一个客户端。
实施例: 客户端A的IP地址为255.255.255.153。我告诉它连接,一切正常。 客户端B的IP地址为255.255.255.156。我告诉它连接,服务器说已经连接了。
我的strcmp不正确吗?还有别的吗?请帮忙。
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Function",
"type": "node",
"request": "attach",
"port": 5858
}
]
}
答案 0 :(得分:1)
inet_ntoa()
的POSIX规范包含以下信息:
inet_ntoa()
函数应将in指定的Internet主机地址转换为Internet标准点表示法中的字符串。
inet_ntoa()
函数不一定是线程安全的。
inet_ntoa()
的Linux手册页更明确地说明了它的行为方式以及POSIX警告在该平台上的含义:
inet_ntoa()
函数将以网络字节顺序给出的Internet主机地址转换为IPv4点分十进制表示法中的字符串。该字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区。
正如我在comment中所提到的(是的,该评论的第一部分并不准确 - 在iPhone应用程序上阅读代码很难):
...但是你可能会为所有代理使用相同的空间,所以如果你遍历连接的代理,打印名称,你会发现它们都是一样的。我期待那里有
strdup(connectedIP)
之类的东西。
这意味着因为您的代码只是将inet_ntoa()
返回的指针保存在agents
数组中,所以该数组始终包含查找的最后一个主机。您必须从inet_ntoa()
获取结果的副本并保存,然后管理存储。最简单的方法是使用strdup()
复制,但必须记住在连接关闭时释放它。
使用strdup()
或等效机制可以解决您的紧急问题。当心内存泄漏。