sockets - netcat 如何从两个不同的终端监听同一主机上的同一端口?

标签 sockets tcp netcat

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

netcat -p 1234 -l

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

最佳答案

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

关于sockets - netcat 如何从两个不同的终端监听同一主机上的同一端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37570647/

相关文章:

python - 如何使用Python中的socks模块下载网页?

linux - GNU netcat 退出代码总是 1?

unix - sed 是否阻塞?

tcpdump - tcpreplay 不工作客户端没有收到数据

c++ - Boost asio 异步读写

C# 对象类型转换为 byte[],通过 TCP 发送并转换回 double

c - connect() 不返回

go - Golang中的TCP固定大小消息成帧方法

c# - UDP数据传输比TCP慢

python - gevent 中的服务器和同一应用程序中的其他 greenlets