我正在 nc 收听localhost: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!
为什么第一次尝试似乎失败了?
我还注意到,当连接尝试由于某种原因完成(显然成功)时,我的监听进程将退出。不知道为什么会发生这种情况。
答案1
netcat 有许多不同的实现。
我假设您没有使用传统的实现,而是使用更现代的实现,它可以处理 IPv6,因为第一个问题看起来与 IPv6 相关。在这里,我使用的是 OpenBSD 变体nc
(版本 1.217,在 Debian 11 上为 1.217-3)。
第一期:双连接
nc -l 2500
监听 IPv4nc -zv localhost 2500
首先尝试连接到 IPv6 localhost::1
,失败并以 IPv4 localhost 身份重试127.0.0.1
:成功
我的 netcat 提供了更多信息:
$ nc -zv localhost 2500 nc: connect to localhost (::1) port 2500 (tcp) failed: Connection refused Connection to localhost (127.0.0.1) 2500 port [tcp/*] succeeded!
您可以通过以下方式避免这种情况:
在客户端命令上声明 127.0.0.1 而不是 localhost,或者使用
-4
仅尝试 IPv4 的选项。或更改双堆栈首选项的分辨率本地主机优先考虑 IPv4 而不是 IPv6。在基于 glibc 的系统(例如大多数 Linux)上,可以通过添加以下内容来完成
/etc/gai.conf
:precedence ::1/128 5
或通过说明
-6
在服务器命令上声明将使用 IPv6。实际上,IPv6 套接字很可能会默认为双模 IPv4+IPv6。RFC 3493。
第二个问题:服务器命令结束
零模式扫描网猫TCP 只是建立一个连接并结束它:传输零数据,但仍然建立并关闭连接。因此,完成其角色的服务器命令默认结束(这是 OpenBSD 变体的行为。例如,原始/传统变体没有这样做,但也没有使用 IPv6)。
将所需的选项添加到服务器命令中,以便它保留侦听套接字并且不会在收到第一个连接时停止。对于 OpenBSD 版本,这是选项
-k
:“为多个连接保持入站套接字打开”:nc -k -l 2500