Vocês sabem que se quiser testar uma porta TCP um dos métodos mais simples é basicamente um telnet Nome/IP porta.
Se o prompt sumir e o cursor ficar piscando a porta está respondendo (claro,, tirando todas as implicações de liberação de firewall e blá blá blá)
Eu precisava ficar fazendo um teste mais dinâmico, já que o telnet estabelece a conexão e espera uma intervenção para continuar eu queria apenas saber se a porta esta aberta ou não, estávamos tentando identificar uma falha se era no serviço ou na rede.
o script abaixo fica estabelecendo uma comunicação em um intervalo definido usando o socket TCP/IP estão podemos testar TCP e UDP bem no nível da camada e não da aplicação.
ele é bem simples, em qualquer momento que a porta não responda ele coloca a cor de fundo como vermelho.
function TestPort
{
Param(
[parameter(ParameterSetName='ComputerName', Position=0)]
[string]
$ComputerName,
[parameter(ParameterSetName='IP', Position=0)]
[System.Net.IPAddress]
$IPAddress,
[parameter(Mandatory=$true , Position=1)]
[int]
$Port,
[parameter(Mandatory=$true, Position=2)]
[ValidateSet("TCP", "UDP")]
[string]
$Protocol
)
$RemoteServer = If ([string]::IsNullOrEmpty($ComputerName)) {$IPAddress} Else {$ComputerName};
If ($Protocol -eq 'TCP')
{
$test = New-Object System.Net.Sockets.TcpClient;
Try
{
Write-Host "Connecting to "$RemoteServer":"$Port" (TCP)..";
$test.Connect($RemoteServer, $Port);
Write-Host "Connection successful" -BackgroundColor Green;
}
Catch
{
Write-Host "Connection failed" -BackgroundColor Red;
}
Final
{
$test.Dispose();
}
}
If ($Protocol -eq 'UDP')
{
$test = New-Object System.Net.Sockets.UdpClient;
Try
{
Write-Host "Connecting to "$RemoteServer":"$Port" (UDP)..";
$test.Connect($RemoteServer, $Port);
Write-Host "Connection successful" -BackgroundColor Green;
}
Catch
{
Write-Host "Connection failed" -BackgroundColor Red;
}
Final
{
$test.Dispose();
}
}
}
A forma de testar ele é bem simples:
TestPort -ComputerName Nome/IP -Port 1433 -Protocol TCP
Legal né? só que eu precisava ficar fazendo testes direto e reto e da forma acima ele não é um looping…
logo, para fazer da forma mais simples que conheço ficou assim:
$servidor = "Nome/IP"
while (1) {
get-date #só pra saber quando executou
TestPort -ComputerName $servidor -Port 1433 -Protocol TCP
sleep -seconds 1 #tempo de espera entre as execuções
}