服务器认为2个不同IP的客户端是相同的1个客户端(C套接字编程)

时间:2017-12-03 16:44:08

标签: c sockets server

我有一台服务器,它应该允许一个客户端一次连接,执行命令然后关闭。服务器保留“当前连接的”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
    }
]
}

1 个答案:

答案 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()或等效机制可以解决您的紧急问题。当心内存泄漏。