c# プロジェクトで特定の IP のポート スキャン プログラムを追加する小さな要件があります. 効率は高いはずです. 現時点では、インターネットでの検索の効率はあまり高くないので、chatgpt に合計 3 つ問い合わせましたその方法が正しければ、答えを得ることができるはずです. 現時点では、先人が書いたコードである限り、答えることができます;)
1. C# で高速ポート スキャン プログラムを作成するのを手伝ってください
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace PortScanner
{
class Program
{
static void Main(string[] args)
{
Console.Write("请输入要扫描的IP地址:");
string ipAddress = Console.ReadLine();
Console.Write("请输入要扫描的起始端口号:");
int startPort = int.Parse(Console.ReadLine());
Console.Write("请输入要扫描的结束端口号:");
int endPort = int.Parse(Console.ReadLine());
Console.WriteLine($"开始扫描IP地址为 {ipAddress} 的主机的端口...");
for (int port = startPort; port <= endPort; port++)
{
Thread thread = new Thread(() => ScanPort(ipAddress, port));
thread.Start();
}
}
static void ScanPort(string ipAddress, int port)
{
using (TcpClient tcpClient = new TcpClient())
{
try
{
tcpClient.Connect(ipAddress, port);
Console.WriteLine($"端口 {port} 开放");
}
catch
{
Console.WriteLine($"端口 {port} 关闭");
}
}
}
}
}
プログラムは、スキャンする IP アドレス、開始ポート番号、および終了ポート番号を入力するようにユーザーに促し、複数のスレッドを開始して、指定された IP アドレスのポートを同時にスキャンします。開いているポートがスキャンされると、プログラムはポート番号を出力して開いているとマークし、それ以外の場合、プログラムはポート番号を出力して閉じているとマークします。
このコードで使用されている tcpclient の効率は高くなく、ソケットを使用する方が効率的であるため、質問 2 を行います
2. C# で高速ポート スキャン プログラムを作成し、ソケットで実装するのを手伝ってください。
using System;
using System.Net;
using System.Net.Sockets;
namespace PortScanner
{
class Program
{
static void Main(string[] args)
{
string target = args[0];
int startPort = int.Parse(args[1]);
int endPort = int.Parse(args[2]);
for (int port = startPort; port <= endPort; port++)
{
try
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse(target), port));
Console.WriteLine($"Port {port} is open.");
socket.Close();
}
catch (SocketException)
{
// Port is closed
}
}
}
}
}
プログラムはSocket
、クラスTCP 接続を確立し、指定された IP アドレスのポートが開いているかどうかを確認します。プログラムは、ターゲット IP アドレス、開始ポート、終了ポートの 3 つのパラメーターを渡す必要があります。プログラムは、開始ポートから終了ポートまですべてのポートを周期的にスキャンし、開いているポートを出力します。ポートが閉じている場合は無視され、スキャンは次のポートに進みます。
上記のコードはソケットを使用していますが、マルチスレッドを使用していないため、質問 3 が発生します。
3 C# でマルチスレッドの高速ポート スキャン プログラムを作成し、それをソケットで実装するのを手伝ってください
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
class PortScanner
{
static int startPort = 1;
static int endPort = 65535;
static string host = "localhost";
static void Main(string[] args)
{
// 使用默认参数或命令行参数
if (args.Length == 2)
{
host = args[0];
startPort = int.Parse(args[1]);
}
else if (args.Length == 3)
{
host = args[0];
startPort = int.Parse(args[1]);
endPort = int.Parse(args[2]);
}
Console.WriteLine("Scanning host {0} from port {1} to {2}", host, startPort, endPort);
// 创建线程池
int threads = Environment.ProcessorCount * 4;
ThreadPool.SetMinThreads(threads, threads);
// 开始端口扫描
for (int port = startPort; port <= endPort; port++)
{
ThreadPool.QueueUserWorkItem(CheckPort, port);
}
Console.ReadLine();
}
static void CheckPort(object portObject)
{
int port = (int)portObject;
try
{
// 创建Socket
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
// 设置连接超时时间为1秒
socket.ReceiveTimeout = 1000;
socket.SendTimeout = 1000;
// 连接到端口
socket.Connect(host, port);
// 如果连接成功,输出端口号
Console.WriteLine("Port {0} is open", port);
// 关闭Socket
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
catch (Exception)
{
// 忽略连接失败的情况
}
}
}
プログラムはスレッドプールを使用してマルチスレッドスキャンを実現し、複数のポートを同時にスキャンできるため、スキャン効率が向上します。このプログラムは、タイムアウト制御と高速スキャン戦略を実装していないことに注意してください. 本当に高速なポート スキャンを実行する必要がある場合は、専門のスキャン ツールを使用してください.
個人的な評価: 質問 3 に対する回答は、ソケット スレッド プールを使用していますが、これは非常に効率的であり、基本的に私のニーズを満たしています。このフレームワークで改善することができます。要件を提示してchatgptに理解させれば、コードを書くのは難しくないようです!