我可以创建具有相同端口号的多个套接字吗?

问题描述

我读到两个应用程序/进程不能同时侦听同一个端口。我想知道基于 Unix 的系统是否只是“拒绝”创建新套接字并在 App2 请求与 App1 具有相同端口号的套接字时为该套接字分配新内存(双工)。

它是像我怀疑的那样“拒绝”App2 还是继续创建一个新的套接字并无论如何为 App2 分配所需的套接字内存。

如果它确实分配了新的内存,那么它是如何阻止 App2 监听的。以及客户端如何知道哪个套接字接收服务器发送的信息,因为它们都使用相同的端口。如果可能的话,我需要一个冗长的解释,因为我很困惑。谢谢

解决方法

我了解到两个应用程序/进程不能同时侦听同一个端口。

它们不能同时侦听同一网络接口上的同一端口,除非使用了 SO_REUSEADDR/SO_REUSEPORT 套接字选项。否则,它们可能会在不同的网络接口上侦听同一端口。

它是否像我怀疑的那样“拒绝”App2

是的,如果第二个应用无法将套接字绑定到指定的接口/端口,则会从 EADDRINUSE 收到 bind() 错误。

还是继续创建一个新的套接字并为 App2 分配所需的套接字内存

socket 将在 bind() 尝试之前创建,所以是的。套接字不会绑定到正在使用的端口。

如果它确实分配了新的内存,那么它是如何阻止 App2 监听的。

如果套接字未listen()连接到端口,

bind() 将失败。