在将套接字与端点绑定之前如何找到可用端口?

Posted

技术标签:

【中文标题】在将套接字与端点绑定之前如何找到可用端口?【英文标题】:how do i find an available port before bind the socket with the endpoint? 【发布时间】:2012-04-11 07:32:46 【问题描述】:

我正在开发一个使用 3 个端口的服务器-客户端应用程序 [TCP SOCKET .Net 4.0].. 因此,应用程序让用户可以选择仅为主套接字设置端口。但我想让服务器应用程序自动查找其他 2 个套接字的可用端口,以便它使用主套接字连接将端口值发送到客户端。然后客户端使用接收到的端口值连接到另一个套接字。

这里有一点解释:

主套接字侦听可配置端口。此套接字接受客户端以启动发送/接收命令。 (文件资源管理器/任务管理器/属性/关机/聊天) 第二个套接字用于文件传输,仅用于传输文件,完成后关闭。 第三个套接字仅用于接收/发送屏幕截图。

[我知道您可能会说我应该使用同一个套接字进行文件传输和屏幕截图,但是它有点复杂。我只是为它们中的每一个使用单独的套接字。]

那么像这样:

int port = 10000;
bool isAvailable = false;
while(!isAvailable)

    try
     
        // check if the port is available to use.
        isAvailable = true;
    
    catch
    
        port++;
    
 

【问题讨论】:

应该是!isAvailable,否则连while循环都进不去 ***.com/questions/570098/…的可能重复 【参考方案1】:

如果端口号无关紧要,您可以将端口的 0 传递给 IPEndPoint。在这种情况下 操作系统(TCP/IP 堆栈)会为您分配一个空闲端口号。

Socket sock = new Socket(AddressFamily.InterNetwork,
                         SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.1"), 0)); // Pass 0 here.

Console.Out.WriteLine("Assigned port: 0",
                      ((IPEndPoint)sock.LocalEndPoint).Port);

正如@GrokSrc 在 cmets 部分中指出的那样,您当然应该在使用Dispose() 方法或using 语句处理完套接字后处理套接字。

【讨论】:

感谢代码,我使用了。顺便说一句,如果您真的要使用端口,请不要忘记处理套接字! @GrokSrc:感谢您的评论。我会更新我的答案。

以上是关于在将套接字与端点绑定之前如何找到可用端口?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到套接字的本地端口号? (Windows C++)

如何找到哪个进程绑定了一个套接字但不监听?

错误:在将套接字与地址绑定时地址已在使用中,但端口号由“netstat”免费显示

找出异步套接字绑定的端口?

在将用户连接到服务器之前,如何等待 Socket.IO 建立套接字连接?

确定REQ-REP ZeroMQ应用程序客户端发出请求的端口,服务器绑定到两个端点(端口号)?