我想要一个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 下),因此它的工作方式与预期一致,拒绝在同一端口上运行第二个实例。