作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为什么当我从两个不同的终端执行以下命令时(在我的 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_REUSEADDR
和SO_REUSEPORT
,这允许多个进程绑定(bind)到同一个端口和同一个监听地址。参见 man 7 socket
或 this detailed answer .此选项的目标是允许一种简单的负载平衡形式:到端口的传入连接将被重定向到其中一个进程(显然是随机的)。
关于sockets - netcat 如何从两个不同的终端监听同一主机上的同一端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37570647/
我是一名优秀的程序员,十分优秀!