【问题标题】: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++;
        }
    } 
    
  • 【问题讨论】:

    标签: c# sockets client-server port


    【解决方案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:感谢您的评论。我会更新我的答案。
    猜你喜欢
    • 2021-08-25
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多