测试TCP端口是否在未连接的情况下打开

Joh*_*van 6 .net powershell tcpclient powershell-2.0

我被要求将使用的bash脚本转换nc -z为PowerShell。

该站点告诉我nc -z测试端口是否“未连接”打开。有什么方法可以使用.Net做到这一点?

附加信息

通常,要测试端口是否打开,我会用.Net TcpClient创建一个连接。如果连接成功,我也会报告所有问题。MVE:

$isConnected = $false
$client = New-Object -TypeName 'System.Net.Sockets.TcpClient'
try {
    $client.Connect($host, $port)
    $isConnected = $client.Connected
    $client.GetStream().Close(); # handle bug in .net 1.1
    $client.Close();
} catch {
    $isConnected = $false
} finally {
    if ($client.Dispose) {$client.Dispose()} # dispose method not available in all versions, so check before calling
}
Run Code Online (Sandbox Code Playgroud)

但是,尽管不发送任何数据,但它确实可以连接。

可能是由于的描述具有nc -z误导性/只是意味着没有发送数据...我无法以任何方式找到确认。

Rob*_*nce 1

使用测试网络连接

Test-NetConnection -ComputerName $host -Port $port
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

ComputerName     : [computername]
RemoteAddress    : [remoteipaddress]
RemotePort       : 80
InterfaceAlias   : Ethernet 2
SourceAddress    : [sourceipaddress]
TcpTestSucceeded : True
Run Code Online (Sandbox Code Playgroud)

测试网络连接文档

使用 Tcp 客户端类 (.Net):

 New-Object System.Net.Sockets.TcpClient($ip, $port)
Run Code Online (Sandbox Code Playgroud)

输出:

Client              : System.Net.Sockets.Socket
Available           : 0
Connected           : True
ExclusiveAddressUse : False
ReceiveBufferSize   : 65536
SendBufferSize      : 64512
ReceiveTimeout      : 0
SendTimeout         : 0
LingerState         : System.Net.Sockets.LingerOption
NoDelay             : False
Run Code Online (Sandbox Code Playgroud)

TCP 客户端文档