نقل قول: کد مربوط به IP Scanner
سلام ،
روش شما تا حدودی منسوخ شده هست ، البته بستگی داره به اینکه شما از چه نسخه ای از دان نت فریم ورک استفاده میکنین ،
من یه کد نمونه رو برای شما نوشتم ، فقط در نظر داشته باشین که چون دیر وقت بود زیاد روش وقت نذاشتم ! و اینکه این کد با .NET Core 7 کامپایل شده ، و یه سری سینتسک ها ممکنه با دانت فریم ورک فرق داشته باشه.
معماری این کد با async/await و Task ها نوشته شده ، بخشی هم از Tuple ها استفاده شده که امیدوارم کار رو پیچیده نکرده باشه ، اما روش بهینه تری هم وجود داره اونم استفاده از async Parallel.Foreach هست که شما میتونین هسته های CPU رو به صورت بهینه و نه یکباره درگیر کنین ، که کمی پیچیدگی داره و از حوصله اینجا خارجه.
تابع موتور داخلی Ping :
private static Task<(string IPAddress, bool IsAlive)> IsHostAlive(string IPAddress)
{
try
{
Using Ping pingTarget = new();
PingReply reply = pingTarget.Send(IPAddress, 1000);
return Task.FromResult((IPAddress, reply.Status is IPStatus.Success));
}
catch
{
return Task.FromResult((IPAddress, false));
}
}
تابع اصلی عملیات Ping :
public static async Task<IEnumerable<(string IPAddress, bool IsAlive)>> PingAllTaskAsync(IEnumerable<string> IPAddresses)
{
List<Task<(string IPAddress, bool IsAlive)>> PingList = new();
foreach (string targetIp in IPAddresses)
{
PingList.Add(IsHostAlive(targetIp));
}
return await Task.WhenAll(PingList);
}
و اما تابع تست ( کنسول ) :
من 100 بار آی پی 8.8.8.8 رو پینگ کردم ، به نظر سرعت خوبی داره ، با اینترنت من که چندان هم تعریفی نیست 100 تا رو حدود 5 ثانیه Ping کرد ، CPU تقریبا 0.5% ( Core i9 11900) بود ، که چون عملیات پینگ IO Bound هست و نه CPU Bound بنابراین CPU اهمیتی نداره ، ولی حافظه رو دقت کنین که مدیریت کنین چون تصاعدی میره بالا و در معماری x86 اگر مصرف رم پروسس شما به حدود 1.2 GB برسه نرم افزارتون Unstable میشه و به خاطر سرریز حافظه و پشته ، یا برنامه بسته میشه و یا از خودش رفتارهای غیر عادی نشون میشده !
static async Task Main(string[] args)
{
List<string> IPs = new();
for (int i = 0; i <= 1_00; i++)
{
IPs.Add("8.8.8.8");
}
Console.WriteLine($"{DateTime.Now} Pinging Starts...");
IEnumerable<(string IPAddress, bool IsAlive)> results = await PingAllTaskAsync(IPs);
foreach ((string IPAddress, bool IsAlive) in results)
{
Console.WriteLine($"{IPAddress} is {(IsAlive ? "Online" : "Offline")}");
}
Console.WriteLine($"{DateTime.Now} Pinging Finished.");
}
نقل قول: کد مربوط به IP Scanner
شاید این کد به شما کمک کنه
using Nmap;
class Program
{
static void Main(string[] args)
{
var target = new NmapTarget("192.168.1.1/24");
var nmap = new NmapService();
var options = new NmapOptions { Ports = "80" };
var report = nmap.Scan(target, options);
foreach (var host in report.Hosts)
{
Console.WriteLine($"Host: {host.Address}");
foreach (var port in host.Ports)
{
Console.WriteLine($"Port: {port.PortId} - State: {port.State}");
}
}
}
}