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;
        }

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

时间: 2024-12-20 21:31:05

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

openstack数据库获取一个虚机的floating_ip, fix_ip, project_name, user_name, hostname, host

 转载请注明 http://www.cnblogs.com/juandx/p/5418204.html openstack有3个库,nova,neutron,keystone,我现在需要做的是跨库联表查询虚机的信息 获取一个虚机的floating_ip, fix_ip, project_name, user_name, hostname, host (不知道在instances表中host和node有什么区别) select j.floating_ip_address as floating_i

Unity中Instantiate一个prefab时需要注意的问题

在调用Instantiate()方法使用prefab创建对象时,接收Instantiate()方法返回值的变量类型必须和声明prefab变量的类型一致,否则接收变量的值会为null. 比如说,我在脚本里面定义: public GameObject myPrefab; 那么在使用这个myPrefab做Instantiate()的时候,接收返回值变量的类型也必须是GameObject,如下: GameObject newObject = Instantiate(myPrefab) as GameOb

从Resource Manager中获取一个新的Application ID

前提:有一个hadoop集群,并且拷贝core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml到classpath下,可以使src/main/resources 1.获取一个GetNewApplicationRequest,实例是protobuf的类GetNewApplicationRequestPBImpl,未来会支持其他序列化方式.序列化方式决定了RPC工厂,产生哪种可序列化类. Records.newRecord,就是实例化一个pr

shell 中获取一个uuid

写shell脚本时,有时想要制造一个唯一的ID(例如临时文件)可以用以下命令获取一个UUID cat /proc/sys/kernel/random/uuid 当然通常用一个随机的数字或者随机字符串基本也可以满足一个唯一性较好的临时名字了.不过用uuid可能更加保险一点.

LoadRunner中获取一个场景运行时的唯一值

/* * 本代码产生一个从1970年1月1日0时开始累计以毫秒为单位的数值, * 在需要唯一值的地方使用时前缀上VuserID以保证场景运行期内该值为唯一 * (局限:不适用于脚本单次执行时间小于1毫秒的情况,当然该情况非常罕见,所以请放心使用) */ int a; int b; typedef long time_t; struct _timeb { time_t time; unsigned short millitm; short timezone; short dstflag; }; s

在链表中获取一个数据、查找操作C语言实现

SN *Get_S_Node ( SN *head ) { /* head 为要查询的链表的头指针 */ SN *Get_S_Node = NULL; INT32 OSM = 1,i32i = 0, data_num = 0; /* OSM是标志符,i32i是一个循环体内的变量,data为要获取的元素的序号 */ Get_S_Node = ( SN * )malloc( sizeof (SN) ); Get_S_Node = head; /* 输入要获取的数据 */ OSM = OSM_Prin

Unity中获取移动设备GPS信息

代码控制打开权限以及获取经纬度: public string gps_info = ""; public int flash_num = 1; public float n; public float e; public IEnumerator StartGPS() { // Input.location 用于访问设备的位置属性(手持设备), 静态的LocationService位置 // LocationService.isEnabledByUser 用户设置里的定位服务是否启用 i

Unity中获取Animator中动画片段的时长

开发环境:Unity5.6.2 private Animator animator; public void GetLengthByName(string name) { float length = 0; AnimationClip[] clips = animator.runtimeAnimatorController.animationClips; foreach(AnimationClip clip in clips) { if(clip.name.Equals(name) { leng

Android 程序中获取一个反向 Shell

代码如下: String command = "ls -al /"; Process process = Runtime.getRuntime().exec(command); 之后即可通过 Process 对象获取输入输出 这样获得的shell具有的是与应用相同的 UID, 所以无法做到一些越权访问的命令, 比如 ls -al /data/misc 原文地址:https://www.cnblogs.com/seliote/p/9313596.html