如何查找TCP/UDP监听程序?System.Net程序集加载后类型找不到问题
不管你用Windows还是类Unix系统(Linux/macOS),netstat都是查找监听端口的实用工具,我分系统给你说具体用法:
Windows平台
- 想一次性查看所有TCP/UDP监听端口,还附带程序名和PID的话,直接执行:
参数拆解:netstat -ano-a:显示所有连接和监听端口,不会遗漏-n:以数字形式显示地址和端口,避免DNS解析,速度更快-o:列出每个连接对应的进程ID(PID),方便定位占用端口的程序
- 只想筛选TCP的监听端口?加个过滤:
netstat -ano | findstr "LISTENING" | findstr "TCP" - 要查找特定端口(比如8080):
netstat -ano | findstr ":8080"
Linux/macOS平台
- 查看全量TCP/UDP监听端口+程序名+PID,用这条命令:
参数解释:netstat -tulpn-t:仅显示TCP端口-u:仅显示UDP端口-l:仅展示处于监听状态的端口-p:显示对应的程序名和PID(需要root权限执行,否则可能显示-)-n:以数字形式显示地址和端口,跳过DNS解析
- 过滤TCP监听端口:
netstat -tulpn | grep LISTEN - 查找特定端口:
netstat -tulpn | grep ":8080"
另外提一嘴,现在很多Linux系统更推荐用ss替代netstat,效率更高,用法类似:
ss -tulpn
兄弟,你踩了个常见的小误区:[net]根本不是PowerShell里的有效类型别名,而[System.Net]是命名空间,不是具体的类型——这就是你报错的核心原因!
你之前的加载命令其实都成功了,但你混淆了命名空间和类型的区别:System.Net.dll是承载System.Net命名空间下各类类型的程序集,但你不能直接引用命名空间,得调用命名空间下的具体类型,比如[System.Net.IPAddress]、[System.Net.WebClient]这些。
先确认程序集真的加载成功
你可以执行这条命令查看已加载的程序集,确认System.Net在列表中:
[AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.FullName -match "System.Net" }
正确使用System.Net下的类型
举个实际例子,你想创建WebClient对象或者调用静态方法,得这么写:
# 创建WebClient实例 $webClient = New-Object System.Net.WebClient # 调用静态方法获取主机名 [System.Net.Dns]::GetHostName()
PowerShell没有默认的[net]类型别名,所以必须写完整的「命名空间+类型名」。
关于加载方式的小优化
你之前用了好几种加载命令,其实在PowerShell 3.0及以上版本,大部分.NET程序集会自动加载,完全不需要手动执行Add-Type或LoadWithPartialName(而且LoadWithPartialName已经被弃用了,别再用了)。如果确实需要手动加载,这一条就够了:
Add-Type -AssemblyName System.Net
PowerShell会自动从全局程序集缓存(GAC)里找到对应程序集,不用你手动指定本地路径。
为啥[net]不行?
PowerShell里的类型别名比如[xml]、[regex]是系统预定义的,[net]并不是默认别名。如果你非要自定义别名,也只能针对单个类型,比如:
New-Alias -Name net -Value System.Net.IPAddress
但这意义不大,不如直接写完整类型名来得清晰。
总结一下:你加载程序集的操作没毛病,就是误解了命名空间和类型的区别——直接用[System.Net.具体类型]就能正常调用了,试试上面的例子肯定没问题。
内容的提问来源于stack exchange,提问作者Roman




