码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-04-11 21:41:52      阅读:1025      评论:0      收藏:0      [点我收藏+]

标签:unity   指点   creat   tcpl   regex   star   style   str   tin   

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

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中获取一个本机没有被使用过的端口号

标签:unity   指点   creat   tcpl   regex   star   style   str   tin   

原文地址:https://www.cnblogs.com/kaishanguai/p/8798480.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!