![每个插座通常只允许使用一次](https://linux22.com/image/1564193/%E6%AF%8F%E4%B8%AA%E6%8F%92%E5%BA%A7%E9%80%9A%E5%B8%B8%E5%8F%AA%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E4%B8%80%E6%AC%A1.png)
尝试在 Windows 上监听已经使用的端口(例如,运行同一个套接字服务器的两个实例)会出现以下情况:
[WinError 10048] 通常只允许使用每个套接字地址(协议/网络地址/端口)一次
我很困惑为什么每个地址只能使用一次通常情况下允许。我以为这是一条绝对规则(至少在 Unix 上),但显然不是。在什么情况下(以及如何)可能有两个程序使用相同的套接字地址?或者我误解了这个错误?
答案1
并非所有 UNIX 系统都遵循这一绝对规则。有些 UNIX 系统具有扩展功能,允许多个进程绑定到相同的地址和端口组合,然后内核将负责将传入连接分发到多个侦听器。这样做的好处是,您的应用程序无需自行处理多路复用连接,而只需担心处理连接,这反过来为您提供了一种快速且非常易于实现的机制,以允许网络代码中的并行性。
在 Linux 上,这个套接字选项称为SO_REUSEPORT
,许多广泛使用的高性能服务器软件(包括 Apache HTTPD 和 nginx 之类的软件)都支持使用它。
Windows 使用的是 4.4BSD 网络代码的直接克隆,因此具有相同的套接字选项概念,并且有自己的控制选项。根据这个 StackOverflow 答案,那里所讨论的选项称为SO_REUSEADDR
,并且有一个等效的“反选项”称为SO_EXCLUSIVEADDRUSE
。
值得注意的是,没有什么可以阻止多个不同的禁止程序使用此选项并绑定到同一端口。这在调试网络问题时会导致各种麻烦,并且也是一个相当重要的安全考虑因素。