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

19
我正在开发一个使用3个端口[TCP SOCKET .Net 4.0]的服务器客户端应用程序... 所以应用程序会让用户仅设置主套接字的端口。但是我想让服务器应用程序自动找到其他两个套接字的可用端口,以便通过主套接字连接将端口值发送给客户端,然后客户端使用接收到的端口值连接到其他套接字。
这里有一点解释:
  • 主套接字侦听可配置端口。此套接字接受客户端开始发送/接收命令。(文件资源管理器/任务管理器/属性/关机/聊天)
  • 第二个套接字仅用于文件传输,只在完成后关闭。
  • 第三个套接字仅用于接收/发送屏幕截图
    [我知道你可能会说我应该为文件传输和屏幕截图使用同一个套接字,但这有点复杂。我只为它们中的每一个使用单独的套接字。] 那么,在绑定套接字与端点之前如何找到可用端口呢?类似于这样的东西:
    int port = 10000;
    bool isAvailable = false;
    while(!isAvailable)
    {
        try
        { 
            // check if the port is available to use.
            isAvailable = true;
        }
        catch
        {
            port++;
        }
    } 
    

  • 1
    应该写成 !isAvailable,否则它甚至不会进入 while 循环。 - Burkhard
    可能是 https://dev59.com/q3RB5IYBdhLWcg3wn4bb 的重复问题,在C++中如何检查TCP端口是否可用。 - Dmitry Reznik
    1个回答

    37
    如果端口号不重要,您可以将端口参数传递为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 在评论中指出的那样,当你完成一个socket时,你应该使用Dispose()方法或using语句来处理它。


    1
    感谢提供这段代码,我已经使用了。顺便提醒一下,如果你实际上要使用该端口,请不要忘记处理套接字! - groksrc
    @GrokSrc:感谢您的评论。我会更新我的答案。 - Hans

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接