C# 如何判斷某個(gè) TCP 端口是否被占用?
在C#中使用TcpClient或者其他通用的方式建立的Socket,該如何判斷這個(gè)端口是否被占用?比如下面的代碼:
TcpClient tc = new TcpClient(ip,port);
在C#中,可以使用System.Net.NetworkInformation命名空間下的IPGlobalProperties類和TcpConnectionInformation類來(lái)判斷某個(gè)TCP端口是否被占用:
using System.Net.NetworkInformation;
int port = 80;
if(IsPortInUse(port)){
Console.WriteLine($"{port} 端口被占用!");
}else{
Console.WriteLine($"{port} 端口未被占用!");
}
Console.ReadLine();
bool IsPortInUse(int port)
{
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();
foreach (TcpConnectionInformation connection in connections)
{
if (connection.LocalEndPoint.Port == port)
{
// 端口已被占用
return true;
}
}
// 端口未被占用
return false;
}
80 端口未被占用!
在上述示例中,IsPortInUse方法接收一個(gè)整數(shù)參數(shù)表示端口號(hào)。它通過(guò)IPGlobalProperties.GetIPGlobalProperties方法獲取當(dāng)前計(jì)算機(jī)的網(wǎng)絡(luò)連接信息,然后使用GetActiveTcpConnections方法獲取所有活動(dòng)的TCP連接信息。接著,使用循環(huán)遍歷每個(gè)TCP連接信息,判斷本地端點(diǎn)的端口號(hào)是否與傳入的端口號(hào)相同。如果找到匹配的端口號(hào),則表示端口已被占用;否則,表示端口未被占用。
需要注意的是,為了執(zhí)行此操作,可能需要管理員權(quán)限或運(yùn)行在適當(dāng)?shù)牟僮飨到y(tǒng)上。此外,還要確保沒(méi)有其他進(jìn)程在占用同一端口,因?yàn)門(mén)CP連接僅能檢測(cè)到已建立的連接而無(wú)法檢測(cè)到監(jiān)聽(tīng)狀態(tài)的端口。
想要檢測(cè)監(jiān)聽(tīng)狀態(tài)的端口,可以使用System.Net.NetworkInformation命名空間下的IPGlobalProperties類和IPEndPoint類來(lái)獲取所有監(jiān)聽(tīng)的TCP端口。
using System.Net;
using System.Net.NetworkInformation;
public void GetListeningPorts()
{
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] endpoints = properties.GetActiveTcpListeners();
foreach (IPEndPoint endpoint in endpoints)
{
Console.WriteLine($"監(jiān)聽(tīng)狀態(tài)的端口:{endpoint.Port}");
}
}
監(jiān)聽(tīng)狀態(tài)的端口:80
監(jiān)聽(tīng)狀態(tài)的端口:135
監(jiān)聽(tīng)狀態(tài)的端口:445
監(jiān)聽(tīng)狀態(tài)的端口:1433
監(jiān)聽(tīng)狀態(tài)的端口:2383
監(jiān)聽(tīng)狀態(tài)的端口:3306
監(jiān)聽(tīng)狀態(tài)的端口:3389
監(jiān)聽(tīng)狀態(tài)的端口:5040
....
在命令提示符(cmd)中,可以使用 netstat 命令來(lái)列出占用的端口
netstat -ano | findstr LISTENING
這個(gè)命令會(huì)列出所有正在監(jiān)聽(tīng)(被占用)的端口,并顯示與每個(gè)端口關(guān)聯(lián)的進(jìn)程標(biāo)識(shí)符(PID)。
這個(gè)命令的部分:
- netstat:用于顯示網(wǎng)絡(luò)狀態(tài)和連接信息的命令。
- -ano:參數(shù)選項(xiàng),a 用于顯示所有連接和偵聽(tīng)端口,n 用于以數(shù)字格式顯示端口和地址,o 用于顯示關(guān)聯(lián)的進(jìn)程標(biāo)識(shí)符。
- |:管道操作符,將 netstat 的輸出結(jié)果傳遞給下一個(gè)命令。
- findstr:用于搜索指定的字符串或文本的命令。
- LISTENING:要搜索的字符串,表示只搜索正在監(jiān)聽(tīng)的端口。
執(zhí)行上述命令后,將看到正在監(jiān)聽(tīng)的端口列表以及與它們關(guān)聯(lián)的進(jìn)程的 PID??梢愿鶕?jù)需要查找特定的端口或進(jìn)一步處理輸出結(jié)果
C:\Users\Admin>netstat -ano | findstr LISTENING
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 848
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING 4956
TCP 0.0.0.0:2383 0.0.0.0:0 LISTENING 5200
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 4280
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1204
TCP 0.0.0.0:5040 0.0.0.0:0 LISTENING 6424
TCP 0.0.0.0:7680 0.0.0.0:0 LISTENING 8344
TCP 0.0.0.0:49664 0.0.0.0:0 LISTENING 308
TCP 0.0.0.0:49665 0.0.0.0:0 LISTENING 932
TCP 0.0.0.0:49666 0.0.0.0:0 LISTENING 1512
TCP 0.0.0.0:49667 0.0.0.0:0 LISTENING 1364
TCP 0.0.0.0:49668 0.0.0.0:0 LISTENING 2484
TCP 0.0.0.0:49669 0.0.0.0:0 LISTENING 3440
TCP 0.0.0.0:49673 0.0.0.0:0 LISTENING 68
TCP 0.0.0.0:49706 0.0.0.0:0 LISTENING 4956
TCP 0.0.0.0:50128 0.0.0.0:0 LISTENING 4
TCP 127.0.0.1:22 0.0.0.0:0 LISTENING 8960
TCP 127.0.0.1:81 0.0.0.0:0 LISTENING 8960
TCP 127.0.0.1:443 0.0.0.0:0 LISTENING 8960
TCP 127.0.0.1:1434 0.0.0.0:0 LISTENING 4956
TCP 127.0.0.1:4012 0.0.0.0:0 LISTENING 4180
TCP 127.0.0.1:4013 0.0.0.0:0 LISTENING 4180
TCP 127.0.0.1:4301 0.0.0.0:0 LISTENING 8008
TCP 127.0.0.1:5533 0.0.0.0:0 LISTENING 18928
TCP 127.0.0.1:9210 0.0.0.0:0 LISTENING 6924
TCP 127.0.0.1:9418 0.0.0.0:0 LISTENING 8960
TCP 127.0.0.1:49672 0.0.0.0:0 LISTENING 3804
TCP 127.0.0.1:57178 0.0.0.0:0 LISTENING 2600
TCP 127.0.0.1:57335 0.0.0.0:0 LISTENING 17900
TCP 192.168.1.108:139 0.0.0.0:0 LISTENING 4
TCP [::]:80 [::]:0 LISTENING 4
TCP [::]:135 [::]:0 LISTENING 848
TCP [::]:445 [::]:0 LISTENING 4
TCP [::]:1433 [::]:0 LISTENING 4956
TCP [::]:2383 [::]:0 LISTENING 5200
TCP [::]:3306 [::]:0 LISTENING 4280
TCP [::]:3389 [::]:0 LISTENING 1204
TCP [::]:7680 [::]:0 LISTENING 8344
TCP [::]:49664 [::]:0 LISTENING 308
TCP [::]:49665 [::]:0 LISTENING 932
TCP [::]:49666 [::]:0 LISTENING 1512
TCP [::]:49667 [::]:0 LISTENING 1364
TCP [::]:49668 [::]:0 LISTENING 2484
TCP [::]:49669 [::]:0 LISTENING 3440
TCP [::]:49673 [::]:0 LISTENING 68
TCP [::]:49706 [::]:0 LISTENING 4956
TCP [::]:50128 [::]:0 LISTENING 4
TCP [::1]:22 [::]:0 LISTENING 8960
TCP [::1]:81 [::]:0 LISTENING 8960
TCP [::1]:443 [::]:0 LISTENING 8960
TCP [::1]:1434 [::]:0 LISTENING 4956
TCP [::1]:9418 [::]:0 LISTENING 8960