为什么IAsyncResult将所有端口报告为已打开?

我有一个在线程中运行的方法,但是当我测试它时报告所有端口都是打开的。 似乎方法: var result = client.BeginConnect(host, port, null, null);var success = result.AsyncWaitHandle.WaitOne(tcpTimeout);传递结果时效果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时,根据非exception确定端口是否打开。

串口扫描示例:

注意:如果您希望同时扫描多个端口,请使用一些Linq将端口列表分成组并执行Parallel.ForEach(4的并发效果很好并且不会压倒Android网络堆栈)。

 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(); }