i have this method running in a thread , but when i test it report all ports as open. it seems that the method : var result = client.BeginConnect(host, port, null, nul
Determine if the port is open based upon a non-Exception when executing EndConnect
.
Example of a serial port scan:
Note: Use some Linq to break your port list into groups and perform a Parallel.ForEach if you wish to scan multiple ports at the same time (a concurrency of 4 works well and does not overwhelm the Android network stack).
bool portOpen;
for (int portNo = 1; portNo < (fasttScan ? 1025 : 65537); portNo++)
{
TcpClient client = new TcpClient
{
SendTimeout = (fasttScan ? 2 : 10),
ReceiveTimeout = (fasttScan ? 2 : 10)
};
var tcpClientASyncResult = client.BeginConnect(ipAddress, portNo, asyncResult =>
{
portOpen = false;
try
{
client.EndConnect(asyncResult);
portOpen = true;
}
catch (SocketException)
{
}
catch (NullReferenceException)
{
}
catch (ObjectDisposedException)
{
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); // ? unknown socket failure ?
}
if (portOpen)
Console.WriteLine($"{ipAddress}:{portNo}:{portOpen}");
client.Dispose();
client = null;
}, null);
tcpClientASyncResult.AsyncWaitHandle.WaitOne();
}