[转] C# 获取本机可用端口

当我们要创建一个Tcp/UDP Server connection ,我们需要一个范围在1000到65535之间的端口 。但是本机一个端口只能一个程序监听,所以我们进行本地监听的时候需要检测端口是否被占用。命名空间System.Net.NetworkInformation下定义了一个名为IPGlobalProperties的类,我们使用这个类可以获取所有的监听连接,然后判断端口是否被占用。

  1 //-----------------------------------------------------------------------------
  2 // Filename: FreePort.cs
  3 //
  4 // Description: Helper methods to find the next free UDP and TCP ports.
  5 //
  6 // History:
  7 // 28 Mar 2012    Aaron Clauson    Copied from http://www.mattbrindley.com/developing/windows/net/detecting-the-next-available-free-tcp-port/.
  8 //-----------------------------------------------------------------------------
  9
 10 using System;
 11 using System.Collections.Generic;
 12 using System.Linq;
 13 using System.Net;
 14 using System.Net.NetworkInformation;
 15 using System.Text;
 16 using System.Threading;
 17
 18 namespace SIPSorcery.Sys.Net
 19 {
 20     public class FreePort
 21     {
 22         private const string PortReleaseGuid = "8875BD8E-4D5B-11DE-B2F4-691756D89593";
 23
 24         /// <summary>
 25         /// Check if startPort is available, incrementing and
 26         /// checking again if it‘s in use until a free port is found
 27         /// </summary>
 28         /// <param name="startPort">The first port to check</param>
 29         /// <returns>The first available port</returns>
 30         public static int FindNextAvailableTCPPort(int startPort)
 31         {
 32             int port = startPort;
 33             bool isAvailable = true;
 34
 35             var mutex = new Mutex(false,
 36                 string.Concat("Global/", PortReleaseGuid));
 37             mutex.WaitOne();
 38             try
 39             {
 40                 IPGlobalProperties ipGlobalProperties =
 41                     IPGlobalProperties.GetIPGlobalProperties();
 42                 IPEndPoint[] endPoints =
 43                     ipGlobalProperties.GetActiveTcpListeners();
 44
 45                 do
 46                 {
 47                     if (!isAvailable)
 48                     {
 49                         port++;
 50                         isAvailable = true;
 51                     }
 52
 53                     foreach (IPEndPoint endPoint in endPoints)
 54                     {
 55                         if (endPoint.Port != port) continue;
 56                         isAvailable = false;
 57                         break;
 58                     }
 59
 60                 } while (!isAvailable && port < IPEndPoint.MaxPort);
 61
 62                 if (!isAvailable)
 63                     throw new ApplicationException("Not able to find a free TCP port.");
 64
 65                 return port;
 66             }
 67             finally
 68             {
 69                 mutex.ReleaseMutex();
 70             }
 71         }
 72
 73         /// <summary>
 74         /// Check if startPort is available, incrementing and
 75         /// checking again if it‘s in use until a free port is found
 76         /// </summary>
 77         /// <param name="startPort">The first port to check</param>
 78         /// <returns>The first available port</returns>
 79         public static int FindNextAvailableUDPPort(int startPort)
 80         {
 81             int port = startPort;
 82             bool isAvailable = true;
 83
 84             var mutex = new Mutex(false,
 85                 string.Concat("Global/", PortReleaseGuid));
 86             mutex.WaitOne();
 87             try
 88             {
 89                 IPGlobalProperties ipGlobalProperties =
 90                     IPGlobalProperties.GetIPGlobalProperties();
 91                 IPEndPoint[] endPoints =
 92                     ipGlobalProperties.GetActiveUdpListeners();
 93
 94                 do
 95                 {
 96                     if (!isAvailable)
 97                     {
 98                         port++;
 99                         isAvailable = true;
100                     }
101
102                     foreach (IPEndPoint endPoint in endPoints)
103                     {
104                         if (endPoint.Port != port)
105                             continue;
106                         isAvailable = false;
107                         break;
108                     }
109
110                 } while (!isAvailable && port < IPEndPoint.MaxPort);
111
112                 if (!isAvailable)
113                     throw new ApplicationException("Not able to find a free TCP port.");
114
115                 return port;
116             }
117             finally
118             {
119                 mutex.ReleaseMutex();
120             }
121         }
122     }
123 } 
时间: 2024-10-14 14:23:12

[转] C# 获取本机可用端口的相关文章

C#动态获取本机可用串口的两种方式

1. private void GetSerialPort() //获取串口列表 { RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm"); if (keyCom != null) { string[] sSubKeys = keyCom.GetValueNames(); foreach (string sName in sSubKeys) { string sV

获取本机CPU,硬盘等使用情况

早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊,这不是在浪费我们的时间吗!!! 话不多说上代码,因为是实习,主管还是挺关照我的,一早就给我发了个类库(里面涉及到要查询本机信息的都有).这样我剩下了一大半的时间, 这个功能总的来说就两步:  一,先获取本机的信息    二,发送邮件. 获取本机信息用到的类库 SystemInfo.cs 和 Dis

获取本机IP、mac地址、计算机名

python获取本机IP.mac地址.计算机名 在python中获取ip地址和在php中有很大不同,我们先来看一下python 获得本机MAC地址: >>> import uuid >>> def get_mac_address(): mac = uuid.UUID(int = uuid.getnode()).hex[-12:] return ':'.join([mac[e:e+2] for e in range(0,11,2)]) >>> get_m

详谈再论JAVA获取本机IP地址

首先,你如果搜索“JAVA获取本机IP地址”,基本上搜到的资料全是无用的.比如这篇:http://www.cnblogs.com/zrui-xyu/p/5039551.html实际上的代码在复杂环境下是不准的 网上一个比较普遍的说法是InetAddress.getLocalHost().getHostAddress()似乎很简单,但忽略了一个问题,即IP地址在现在的网络环境更加复杂了,比如有Lan,WIFI,蓝牙热点,虚拟机网卡...即存在很多的网络接口(network interfaces),

python获取本机IP、mac地址、计算机名

在python中获取ip地址和在php中有很大不同,在php中往往比较简单.那再python中怎么做呢? 我们先来看一下python 获得本机MAC地址: 1 2 3 4 import uuid def get_mac_address():      mac=uuid.UUID(int = uuid.getnode()).hex[-12:]      return ":".join([mac[e:e+2] for e in range(0,11,2)]) 下面再来看一下python获取

C# 获取本机mac地址 客户端主机名称(hostName) 当前用户(CurWinUser) 操作系统版本(WinVersion) IE浏览器版本(IEversion) 物理内存(Memory) 跳至网关的IP地址(IpAddress) CPU序列号 等等

关于获取本机信息的代码,园子里面还是非常多的,专门整理了一下此次用到的信息 首先,获取跳至网管的IP地址 #region 获取调至网管的IP地址 string ipAddress = GetLocalIp(); #endregion ///此方法需要计算机连网,否则获取不到IP地址 private string GetLocalIp() { string result = RunApp("route", "print", true); Match m = Regex

【Appnium+C#+Winform自动化测试系列】一、获取本机连接的设备、启动多个Appnium和获取本机启动的Appnium

本系列内容,准备根据所完成的项目为基线,一步一步的把整个设计和实现过程梳理. 先从基本的一些环境问题入手,梳理清楚关于手机设备和Appnium.因为我们在后面的建立Appnium连接时,需要设备名字和启动的Appnium实例和对应的端口号. 一.获取手机设备 获取本机连接的设备,我们可以通过adb命令通过控制台来实现,在控制台中输入命令adb devices可得如下结果: 既然能 够如此简单的获取到连接的设备,接下来也就是对控制台文字进行处理分析,最后把需要内容获取出来展示在下拉框里即可. 对于

python优雅获取本机 IP 方法

见过很多获取服务器本地IP的代码,个人觉得都不是很好.从网上搜索到一个靠谱的脚本,分享一下! 通过 UDP 获取本机 IP,目前见过最优雅的方法 这个方法是目前见过最优雅获取本机服务器的IP方法了.没有任何的依赖,也没有去猜测机器上的网络设备信息. 而且是利用 UDP 协议来实现的,生成一个UDP包,把自己的 IP 放如到 UDP 协议头中,然后从UDP包中获取本机的IP. 这个方法并不会真实的向外部发包,所以用抓包工具是看不到的.但是会申请一个 UDP 的端口,所以如果经常调用也会比较耗时的,

Python 优雅获取本机 IP 方法

见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import fcntl import struct def get_ip_address(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.i