我有这个方法在线程中运行,但是当我测试它时,它报告所有端口都打开。看来该方法:var result = client.BeginConnect(host, port, null, null);
传递结果时效果不佳var success = result.AsyncWaitHandle.WaitOne(tcpTimeout);
...
知道如何解决吗?
我努力了client.ConnectAsync(host,port).Wait(TcpTimeout);
但这也没有按预期工作......
public void start()
{
Thread thread1 = new Thread(new ThreadStart(RunScanTcp));
thread1.IsBackground = true;
thread1.Name = "THREAD ME EMER : " + i;
thread1.Priority = System.Threading.ThreadPriority.Highest;
thread1.Start();
}
public void RunScanTcp()
{
while (((port = portList.NextPort()) != -1) && (nderprit != true))
{
TcpClient client = new TcpClient();
count = port;
tcp_count = tcp_count + 1;
Thread.Sleep(10);
try
{
var mre = new ManualResetEvent(false);
Console.WriteLine("Current port count : " + port);
var result = client.BeginConnect(host, port, null, null);
var success = result.AsyncWaitHandle.WaitOne(tcpTimeout);
if (success)
{
Console.WriteLine("PORT IS OPEN : " + port);
received_tcp = received_tcp + 1;
Activity.RunOnUiThread(() =>
{
mre.Set();
});
mre.WaitOne();
client.Close();
}
else
{
client.Close();
}
}
catch (Exception)
{
client.Close();
}
}
}
执行时根据非异常判断端口是否打开EndConnect
.
串口扫描示例:
注意:如果您希望同时扫描多个端口(4 的并发性效果很好并且不会压垮 Android 网络堆栈),请使用一些 Linq 将端口列表分成组并执行 Parallel.ForEach。
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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)