我在运行Red Hat 5的虚拟机上使用bash运行以下命令:
for i in {1..100000};
do telnet 10.10.10.105 41941;
done
在某种情况下,telnet会连接到端口,即使没有人在监听它。它似乎正在连接到自己? 当我启动应用程序的客户端时,没有 启动服务器,相同的问题出现了 - 客户端成功连接到ip:port。客户端看起来像这样:
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(port));
addr.sin_addr.s_addr = inet_addr(hostname);
some_while_loop
{
status = ::connect(sock, (sockaddr *)&addr, sizeof(addr));
if (status == -1)
{
shutdown(sock, 2);
close(sock);
return false;
}
}
我发现了这篇文章:http://web.deu.edu.tr/doc/soket/,其中6.2节指出,如果你连接的是同一台机器上运行的程序,那么连接将会成功。我的问题是,为什么会这样?这是一个硬件问题还是红帽内核使用的故障保护机制,或者可能是因为我使用的端口(例如1025),我没有遇到这个问题…?
getsockname(sock, &sock_addr, &addr_size)
来检查端口是否相同,并因此关闭连接。此外,使用setsockopt将上述套接字设置为重用地址(SO_REUSEADDR),如果服务器尝试使用相同的地址和端口,则可以解决任何问题。非常感谢您的帮助。 - user1783445