【问题标题】:How netcat can listen to the same port on the same host from two different terminals?netcat 如何从两个不同的终端监听同一主机上的同一端口?
【发布时间】:2016-09-30 22:31:48
【问题描述】:

为什么当我从两个不同的终端执行以下命令时(在我的 Debian 8.4 机器上)没有输出“地址已在使用”类型的错误?

netcat -p 1234 -l

我想知道为什么它不抛出错误,因为它启动了两个进程在同一个端口上侦听。
netcat 不使用套接字吗?怎么可能?

【问题讨论】:

  • 是的,但正如这里所说:“多个侦听 TCP 套接字,都绑定到同一个端口,可以共存,只要它们都绑定到不同的本地 IP 地址。”只有当套接字绑定到不同的本地 IP 地址时才有可能(如果我理解正确的话),并且据我所知,这里不是这种情况。
  • 这与堆栈溢出无关,因为它不是编程问题。查看超级用户或其他网站了解此类问题。

标签: sockets tcp netcat


【解决方案1】:

在我的系统上,运行 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_REUSEADDRSO_REUSEPORT 选项,允许多个进程绑定到同一个端口和同一个监听地址。请参阅man 7 socketthis detailed answer。此选项的目标是允许一种简单的负载平衡形式:到端口的传入连接将被重定向到其中一个进程(显然是随机的)。

【讨论】:

    【解决方案2】:

    -p 选项指定源端口,而不是侦听端口

    -l 选项将 netcat 置于监听模式。

    在您的示例中,1234-p 选项的输入值,而不是 -l 选项,这意味着没有指定明确的侦听端口。如果 netcat 没有失败,则很可能 netcat 正在绑定到端口 0,这会告诉侦听套接字绑定到随机可用的临时端口。因此,您的两个 netcat 实例实际上会监听不同的端口。使用netstat进行验证。

    根据Linux manpage for netcat

    -l' 用于指定 nc 应该侦听传入连接而不是启动到远程主机的连接。 将此选项与 -p、-s 或 -z 选项结合使用是错误的。此外,使用 -w 选项指定的任何超时都将被忽略。

    -p 源端口
    指定 nc 应使用的源端口,受权限限制和可用性限制。 将此选项与 -l 选项结合使用是错误的。

    所以从技术上讲,您的示例可能一开始就无效。

    但是,在某些系统上,包括一些 Debian 安装,取决于您使用哪种风格的 netcat(特别是传统风格),您实际上可能需要同时使用 -l-p,但您需要交换它们的顺序以正确指定监听端口,例如:

    nc -l -p 1234
    

    【讨论】:

    • 但是有可能多次监听同一个端口:nc -l 1234imgur.com/a/u1xSyjU为什么?
    • 对不起,这不是解释:在两个不同的终端运行nc -l 1234 工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2016-11-19
    • 2012-11-06
    相关资源
    最近更新 更多