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中获取一个本机没有被使用过的端口号的主要内容,如果未能解决你的问题,请参考以下文章