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

本文关键字:何找 套接字 端点 绑定 | 更新日期: 2023-09-27 18:29:06

我正在开发一个使用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++;
        }
    } 
    
  • 在将套接字与端点绑定之前,如何找到可用的端口

    如果端口号无关紧要,可以将端口的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在评论部分指出的那样,当您使用Dispose()方法或using语句处理完套接字时,您当然应该处理套接字。