C# 如何判断某个 tcp 端口是否被占用?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 如何判断某个 tcp 端口是否被占用?相关的知识,希望对你有一定的参考价值。
咨询区
Ali:
在 C# 中使用 TcpClient 或者其他通用的方式建立的 Socket,请问我如何判断这个端口是否被占用?
比如下面的代码:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
回答区
jro:
如果你用 TcpClient 建立的连接,在 System.Net.NetworkInformation
命名空间下有很多种方式去判断端口是否被占用,比如说 IPGlobalProperties
类就可以获取一组 TcpConnectionInformation
对象,然后在这个数组中获取它的 IP 和 Port。
参考如下代码:
public static void Main(string[] args)
IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
try
var port = 666;
if (isPortAvalaible(port))
TcpListener tcpListener = new TcpListener(ipAddress, port);
tcpListener.Start();
catch (Exception ex)
Console.WriteLine(ex.Message);
private static bool isPortAvalaible(int myPort)
var avalaiblePorts = new List<int>();
var properties = IPGlobalProperties.GetIPGlobalProperties();
// Active connections
var connections = properties.GetActiveTcpConnections();
avalaiblePorts.AddRange(connections);
// Active tcp listners
var endPointsTcp = properties.GetActiveTcpListeners();
avalaiblePorts.AddRange(endPointsTcp);
// Active udp listeners
var endPointsUdp = properties.GetActiveUdpListeners();
avalaiblePorts.AddRange(endPointsUdp);
foreach (int p in avalaiblePorts)
if (p == myPort) return false;
return true;
Mohsen:
其实你可以通过 try catch
的方式来判断端口是否被占用,SocketException
下的 10048 状态码就表示 端口占用异常
, 参考如下代码:
public static void Main(string[] args)
string hostname = "localhost";
int portno = 9081;
IPAddress ipa = (IPAddress)Dns.GetHostAddresses(hostname)[0];
try
System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
sock.Connect(ipa, portno);
if (sock.Connected == true)
// Port is in use and connection is successful
Console.WriteLine("Port is Closed");
sock.Close();
catch (System.Net.Sockets.SocketException ex)
if (ex.ErrorCode == 10061)
// Port is unused and could not establish connection
Console.WriteLine("Port is Open!");
else
Console.WriteLine(ex.Message);
点评区
虽然用异常的方式简单粗暴,但这种用异常来处理业务逻辑是不推荐的做法,更加高效的当然就是先获取本机所有的可用端口,然后判断当前 port 是否在其中即可。
以上是关于C# 如何判断某个 tcp 端口是否被占用?的主要内容,如果未能解决你的问题,请参考以下文章