我正在尝试端口扫描给定的IP地址,范围为20个端口。我知道端口80是打开的,所有其他都关闭了。我的代码显示所有端口都已打开。
我正在尝试使用异步TCPClient来实现端口扫描。
这里有什么问题?我错过了什么吗?
private void btnStart_Click(object sender, EventArgs e)
{
for (int port = 80; port < 100; port++)
{
ScanPort(port);
}
}
private void ScanPort(int port)
{
using (TcpClient client = new TcpClient())
{
client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client);
}
}
private void CallBack(IAsyncResult result)
{
using (TcpClient client = (TcpClient)result.AsyncState)
{
try
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "open" + Environment.NewLine;
});
}
catch
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "closed" + Environment.NewLine;
});
}
}
}
这就是我现在的CallBack方法:
private void CallBack(IAsyncResult result)
{
using (TcpClient client = (TcpClient)result.AsyncState)
{
client.EndConnect(result);
if (client.Connected)
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "open" + Environment.NewLine;
});
}
else
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "closed" + Environment.NewLine;
});
}
}
}
答案 0 :(得分:1)
声明:
using (TcpClient client = new TcpClient())
{
client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client);
}
创建一个新的TcpClient,然后调用BeginConnect,然后在到达回调之前立即释放客户端。请记住,BeginConnect方法没有阻塞。客户端的处理应仅在回调中进行,因此ScanPort方法应如下所示:
private void ScanPort(int port)
{
var client = new TcpClient();
try {
client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client);
} catch (SocketException) {
...
client.Close();
}
}
在回调中,您还应拨打EndConnect:
using (TcpClient client = (TcpClient)result.AsyncState)
{
try
{
client.EndConnect(result);
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "open" + Environment.NewLine;
});
}
catch
{
this.Invoke((MethodInvoker)delegate
{
txtDisplay.Text += "closed" + Environment.NewLine;
});
}