在TCP/IP协议中,服务端需要去监听客户端的端口,开始监听,我们需要检测使用的端口是否被占用,获取系统当前使用的所有端口号,用此端口进行匹配即可。
代码如下
/// <summary> /// 检查端口,true表示已被占用 /// </summary> /// <param name="port"></param> /// <returns></returns> internal static Boolean IsPortOccuped(Int32 port) { System.Net.NetworkInformation.IPGlobalProperties iproperties = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties(); System.Net.IPEndPoint[] ipEndPoints = iproperties.GetActiveTcpListeners(); foreach (var item in ipEndPoints) { if (item.Port == port) { return true; } } return false; }
而如果需要实时的刷新端口占用情况,并用其进行TCP连接,希望自己占用的端口在呈现给自己时显示不被占用,例如当服务端UI界面显示监听192.168.0.162IP的客户端时用的9922端口,而不希望在同一DataGridView表中,此行的后面“端口是否被占用“”列中显示已被占用的红色X号图标 , 即在检测端口状态时如果是与此IP通讯占用,排除此IP,如下图
代码如下
static List<IpAndPort> IpAndPortList = new List<IpAndPort>(); static List<string> PortList = new List<string>(); internal static Boolean IsPortOccupedFun2(Int32 port, IpAndPort m_PortList) { System.Net.NetworkInformation.IPGlobalProperties iproperties = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties(); System.Net.IPEndPoint[] ipEndPoints = iproperties.GetActiveTcpListeners(); if (!PortList.Contains(m_PortList.port)) { PortList.Add(m_PortList.port); IpAndPortList.Add(m_PortList); } foreach (var item in ipEndPoints) { if (item.Port == Convert.ToInt32(m_PortList.port)) { foreach (IpAndPort ipPort in IpAndPortList) { if (ipPort.ip.Equals(m_PortList.ip) && ipPort.port.Equals(m_PortList.port)) { return false; } } return true; } } return false; } public class IpAndPort { public string ip; public string port; }