netcat 如何从两个不同的终端侦听同一主机上的同一端口?
How netcat can listen to the same port on the same host from two different terminals?
为什么当我从两个不同的终端执行以下命令时(在我的 Debian 8.4 机器上)没有输出 "Address already in use" 类型的错误?
netcat -p 1234 -l
我想知道为什么它不抛出错误,因为它启动了两个侦听同一端口的进程。
netcat 不使用套接字吗?怎么可能?
-p
选项指定 源端口 ,而不是 侦听端口 。
-l
选项将 netcat 置于侦听模式。
在您的示例中,1234
是 -p
选项的输入值,而不是 -l
选项的输入值,这意味着没有指定明确的侦听端口。如果 netcat 没有失败,那么 netcat 很可能绑定到端口 0,这会告诉侦听套接字绑定到随机可用的临时端口。因此,您的两个 netcat 实例实际上会在不同的端口上侦听。使用netstat验证。
-l' Used to specify that nc should listen for an incoming connection rather than initiate a connection to a remote host. It is an error to use this option in conjunction with the -p, -s, or -z options. Additionally, any timeouts specified with the -w option are ignored.
-p source_port
Specifies the source port nc should use, subject to privilege restrictions and availability. It is an error to use this option in conjunction with the -l option.
所以从技术上讲,您的示例可能一开始就无效。
然而,在某些系统上,包括某些 Debian 安装,根据您使用的 netcat 风格(特别是传统风格),您实际上可能需要使用 -l
和 -p
在一起,但你需要交换他们的顺序以正确指定监听端口,例如:
nc -l -p 1234
在我的系统上,运行 strace nc -l 1234
结束于:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(3, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 1) = 0
accept(3,
所以套接字设置了选项SO_REUSEADDR
和SO_REUSEPORT
,允许多个进程绑定到同一个端口和同一个监听地址。参见 man 7 socket
或 this detailed answer。此选项的目标是允许一种简单的负载平衡形式:到端口的传入连接将被重定向到其中一个进程(显然是随机的)。
为什么当我从两个不同的终端执行以下命令时(在我的 Debian 8.4 机器上)没有输出 "Address already in use" 类型的错误?
netcat -p 1234 -l
我想知道为什么它不抛出错误,因为它启动了两个侦听同一端口的进程。
netcat 不使用套接字吗?怎么可能?
-p
选项指定 源端口 ,而不是 侦听端口 。
-l
选项将 netcat 置于侦听模式。
在您的示例中,1234
是 -p
选项的输入值,而不是 -l
选项的输入值,这意味着没有指定明确的侦听端口。如果 netcat 没有失败,那么 netcat 很可能绑定到端口 0,这会告诉侦听套接字绑定到随机可用的临时端口。因此,您的两个 netcat 实例实际上会在不同的端口上侦听。使用netstat验证。
-l' Used to specify that nc should listen for an incoming connection rather than initiate a connection to a remote host. It is an error to use this option in conjunction with the -p, -s, or -z options. Additionally, any timeouts specified with the -w option are ignored.
-p source_port
Specifies the source port nc should use, subject to privilege restrictions and availability. It is an error to use this option in conjunction with the -l option.
所以从技术上讲,您的示例可能一开始就无效。
然而,在某些系统上,包括某些 Debian 安装,根据您使用的 netcat 风格(特别是传统风格),您实际上可能需要使用 -l
和 -p
在一起,但你需要交换他们的顺序以正确指定监听端口,例如:
nc -l -p 1234
在我的系统上,运行 strace nc -l 1234
结束于:
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(3, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 1) = 0
accept(3,
所以套接字设置了选项SO_REUSEADDR
和SO_REUSEPORT
,允许多个进程绑定到同一个端口和同一个监听地址。参见 man 7 socket
或 this detailed answer。此选项的目标是允许一种简单的负载平衡形式:到端口的传入连接将被重定向到其中一个进程(显然是随机的)。