如何让 `nc` 在不设置 `SO_REUSEPORT` 的情况下监听端口

如何让 `nc` 在不设置 `SO_REUSEPORT` 的情况下监听端口

我想要一个nc命令监听 TCP 端口,因此我这样做了:

nc -lv 8888

然后在另一个控制台中,我检查尝试侦听同一端口的另一个程序是否会收到某种Address already in use错误,因此我再次发出了相同的命令:

nc -lv 8888

令我惊讶的是,第二条命令也成功了。研究了两个程序如何监听同一个 TCP 端口,我发现如果使用选项打开监听套接字,这是可能的SO_REUSEPORT,所以我想象 nc正在使用它。

我如何才能nc禁止其他程序使用同一端口?我希望它监听端口 8888,并确保这是唯一监听该端口的程序。

到目前为止,我已经能够通过这样的socat介绍来做我想做的事情:nc

socat TCP-LISTEN:8888,fork TCP:localhost:4444
nc -lv 4444

因为socat不允许任何其他程序监听同一个端口。

但仅凭 就能实现这一目标吗nc

答案1

查看 netcat 源代码网猫在方法中local_listen

        ret = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x));
        if (ret == -1)
            err(1, NULL);

# if defined(SO_REUSEPORT)
        ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof(x));
        if (ret == -1)
            err(1, NULL);
# endif

然后为了修改行为,您需要修改代码。

但是,我使用 Ubuntu Xenial 的 netcat-openbsd 1.105-7 进行了测试,发现它似乎在构建时没有定义 SO_REUSEPORT。由于它设置了 SO_REUSEADDR 但没有设置 SO_REUSEPORT(在内核 > 3.9 下),因此它的工作方式与预期一致,拒绝在同一端口上运行第二个实例。

相关内容