Unity中获取一个本机没有被使用过的端口号

Posted kaishanguai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity中获取一个本机没有被使用过的端口号相关的知识,希望对你有一定的参考价值。

百度了一下,主要两种做法:

1、利用GetActiveTcpListeners()方法

         怎么使用百度很多文章,但是我试了以后,得到的端口列表跟 netstat -ano 一比较,完全不对,至于为什么,没找到相关文章,自己看资料看了半天也没找到是什么原因,对这个比较熟悉的朋友可以指点下是什么原因。

2、利用进程运行netstat ano命令,获取到输出文本,得到已被占用的端口信息。

  这种方法有个很坑的地方,大多文章的做法是:

            List<int> ports = new List<int>();

            Process pro = new Process();

            pro.StartInfo.FileName = "cmd.exe";

            pro.StartInfo.UseShellExecute = false;

            pro.StartInfo.RedirectStandardInput = true;

            pro.StartInfo.RedirectStandardOutput = true;

            pro.StartInfo.RedirectStandardError = true;

            pro.StartInfo.CreateNoWindow = true;

            pro.Start();

            pro.StandardInput.WriteLine("netstat -ano");

            pro.StandardInput.WriteLine("exit");

            Regex reg = new Regex("\\s+");

            string line = null;

            ports.Clear();

 

            while ((line = pro.StandardOutput.ReadLine()) != null)

            { 

            }

  我尝试后,并没有得到相关内容,只得到下面这几行文字:

    Microsoft Windows [版本 10.0.16299.309]

    (c) 2017 Microsoft Corporation。保留所有权利。 

    C:\Users\Suyu>netstat –ano

    C:\Users\Suyu>exit

                 

  经过一天尝试,在快要崩溃的时候终于找到正确的打开方式:

        /// <summary>
        /// 返回可用端口号
        /// </summary>
        /// <returns></returns>                
        public int GetAvailablePort()
        {
            int BeginPort = 50000;              //开始端口
            int EndPort = 65535;                //结束端口
               
            Process p = new Process();
            p.StartInfo = new ProcessStartInfo("netstat", "-an");
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.StartInfo.RedirectStandardOutput = true;
            p.Start();

            List<int> ports = new List<int>();
            string line = null;
            Regex reg = new Regex("\\s+");

            while ((line = p.StandardOutput.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase) ||
                    line.StartsWith("UDP", StringComparison.OrdinalIgnoreCase))
                {
                    line = reg.Replace(line, ",");
                    string[] arr = line.Split(,);
                    string soc = arr[1];
                    int pos = soc.LastIndexOf(:);
                    int port = int.Parse(soc.Substring(pos + 1));
                    //大于开始端口才记录
                    if (port >= BeginPort)
                        ports.Add(port);
                }
            }
            p.Close();

            int result = BeginPort;
            for (int i = BeginPort; i < EndPort; i++)
            {
                if (ports.FindIndex(a => a == i) > -1)
                    continue;
                else
                {
                    result = i;
                    break;
                }
            }
            return result;
        }

 

以上是关于Unity中获取一个本机没有被使用过的端口号的主要内容,如果未能解决你的问题,请参考以下文章

wcf客户端怎么获取自身使用的端口号?

怎么查看电脑的端口号

如何获取当前在android中活动的wifiNetwork的端口号

怎么看电脑的端口号

linux下怎么查看程序使用的端口号

Unity项目学习笔记