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

Mur*_*sli 16 c# sockets port client-server

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

这里有一点解释:

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

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

    那么在将套接字与端点绑定之前,如何找到可用端口?这样的事情:

    int port = 10000;
    bool isAvailable = false;
    while(!isAvailable)
    {
        try
        { 
            // check if the port is available to use.
            isAvailable = true;
        }
        catch
        {
            port++;
        }
    } 
    
    Run Code Online (Sandbox Code Playgroud)
  • Han*_*ans 34

    如果端口号无关紧要,可以将端口号传递给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);
    
    Run Code Online (Sandbox Code Playgroud)

    正如@GrokSrc在评论部分中指出的那样,当你使用Dispose()方法或using语句完成套接字时,你当然应该处理套接字.