Ι am nc-listening onlocalhost:2500
▶ nc -l 2500
_
在另一个终端上,我试图连接到这个监听端
▶ nc -zv localhost 2500
nc: connectx to localhost port 2500 (tcp) failed: Connection refused
Connection to localhost port 2500 [tcp/rtsserv] succeeded!
为什么第一次尝试似乎失败了?
我还注意到,当连接尝试由于某种原因完成(显然成功)时,我的侦听过程退出。不知道为什么会这样。
netcat 有许多不同的实现。
我假设您没有使用传统的实现,而是使用更现代的实现,它可以处理 IPv6,因为第一个问题看起来与 IPv6 有关。在这里,我使用的是
nc
(版本 1.217,在 Debian 11 上为 1.217-3)的 OpenBSD 变体。第一个问题:双连接
nc -l 2500
侦听 IPv4nc -zv localhost 2500
首先尝试连接到 IPv6 localhost::1
,失败并以 IPv4 localhost 透明重试127.0.0.1
:成功我的 netcat 提供了更多信息:
您可以通过以下方式避免这种情况:
在客户端命令上声明 127.0.0.1 而不是 localhost 或使用
-4
仅尝试 IPv4 的选项。或更改localhost解析的双栈首选项以支持 IPv4 而不是 IPv6。在基于 glibc 的系统(例如大多数 Linux)上,可以通过将其添加到以下位置来完成
/etc/gai.conf
:或通过说明
-6
将使用 IPv6 的服务器命令。实际上,根据RFC 3493,IPv6 套接字很可能默认为双模式 IPv4+IPv6 。第二个问题:服务器命令结束
使用 TCP 的netcat的零模式扫描只是建立一个连接并结束它:传输零数据,但仍然建立并关闭了一个连接。因此,完成其角色的服务器命令默认结束(这是 OpenBSD 变体的行为。例如,原始/传统变体没有这样做,但也没有使用 IPv6)。
将所需的选项添加到服务器命令,以便它保持侦听套接字并且不会在收到第一个连接时停止。对于 OpenBSD 版本,这是选项
-k
:“保持入站套接字打开以进行多个连接”:请注意,还有其他netcat实现,每个都有自己的细微差别。我对使用哪个的建议是:无,使用
socat
具有更多功能的替代。