C# 为什么IAsyncResult报告所有端口都已打开?
我在线程中运行了这个方法,但是当我测试它时,报告所有端口都是打开的。方法:C# 为什么IAsyncResult报告所有端口都已打开?,c#,android,xamarin,mono,xamarin.android,C#,Android,Xamarin,Mono,Xamarin.android,我在线程中运行了这个方法,但是当我测试它时,报告所有端口都是打开的。方法:var result=client.BeginConnect(主机、端口、null、null)工作不正常 你知道怎么解决吗 我尝试了client.ConnectAsync(主机,端口).Wait(TcpTimeout)但这也不能像预期的那样工作 public void start() { Thread thread1 = new Thread(new ThreadStart(RunScanT
var result=client.BeginConnect(主机、端口、null、null)在var success=result.AsyncWaitHandle.WaitOne(tcpTimeout)中传递结果时,代码>工作不正常代码>
你知道怎么解决吗
我尝试了client.ConnectAsync(主机,端口).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
时,根据非异常情况确定端口是否打开
串行端口扫描示例:
注意:如果您希望同时扫描多个端口,请使用一些Linq将端口列表分成多个组,并执行Parallel.ForEach(并发数为4很好,不会淹没Android网络堆栈)
boolportopen;
对于(int-portNo=1;portNo<(fastscan?1025:65537);portNo++)
{
TcpClient client=新的TcpClient
{
SendTimeout=(fasttScan?2:10),
接收超时=(快速扫描?2:10)
};
var tcpClientASyncResult=client.BeginConnect(IP地址、端口号、异步结果=>
{
portOpen=false;
尝试
{
EndConnect(异步结果);
portOpen=true;
}
捕获(SocketException)
{
}
捕获(NullReferenceException)
{
}
捕获(ObjectDisposedException)
{
}
捕获(例外情况除外)
{
Console.WriteLine(例如Message);//?未知套接字故障?
}
如果(端口开放)
WriteLine($“{ipAddress}:{portNo}:{portOpen}”);
client.Dispose();
client=null;
},空);
tcpClientASyncResult.AsyncWaitHandle.WaitOne();
}
执行EndConnect
时,根据非异常情况确定端口是否打开
串行端口扫描示例:
注意:如果您希望同时扫描多个端口,请使用一些Linq将端口列表分成多个组,并执行Parallel.ForEach(并发数为4很好,不会淹没Android网络堆栈)
boolportopen;
对于(int-portNo=1;portNo<(fastscan?1025:65537);portNo++)
{
TcpClient client=新的TcpClient
{
SendTimeout=(fasttScan?2:10),
接收超时=(快速扫描?2:10)
};
var tcpClientASyncResult=client.BeginConnect(IP地址、端口号、异步结果=>
{
portOpen=false;
尝试
{
EndConnect(异步结果);
portOpen=true;
}
捕获(SocketException)
{
}
捕获(NullReferenceException)
{
}
捕获(ObjectDisposedException)
{
}
捕获(例外情况除外)
{
Console.WriteLine(例如Message);//?未知套接字故障?
}
如果(端口开放)
WriteLine($“{ipAddress}:{portNo}:{portOpen}”);
client.Dispose();
client=null;
},空);
tcpClientASyncResult.AsyncWaitHandle.WaitOne();
}
谢谢,这是一个很好的例子,我在我的项目中进行了测试,并成功地对我的需求进行了一些调整。。。感谢Bolloanks,这是一个非常好的例子,我在我的项目中进行了测试,并成功地对我的需求进行了一些调整。。。谢谢兄弟
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();
}