PDA

View Full Version : کد مربوط به IP Scanner



csharpdoost
چهارشنبه 30 فروردین 1402, 23:31 عصر
دوستان سلام. من خیلی جستجو کردم یه کد خوب درباره اسکنر شبکه پیدا کنم اما متاسفانه جز کد زیر که خیلی هم کند هستش و یکی دو مورد دیگه چیزی زیادی گیرم نیومد.
ممنون میشم از دوستان راهنمایی کنن .



Task t1 = Task.Factory.StartNew(new Action(() =>
{

for (int i = int.Parse(EndHostTxtIP); i < int.Parse(EndHostTxtIP2); i++)
{
if (cancel) break;

string ip = $"{subnet}.{i}";
Ping ping = new Ping();
PingReply reply = ping.Send(ip, 10);
if (reply.Status == IPStatus.Success)
{

progressBar1.BeginInvoke(new Action(() =>
{
try
{
IPHostEntry host = Dns.GetHostEntry(IPAddress.Parse(ip));
listVAddr.Items.Add(new ListViewItem(new String[] { ip, host.HostName, "متصل" }));
}
catch
{
// MessageBox.Show($"Couldn't retrieve hostname from {ip}", "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
progressBar1.Value += 1;
lblStatus.ForeColor = Color.Blue;
lblStatus.Text = $"در حال جستجو: {ip}";

if (progressBar1.Value == 253)
lblStatus.Text = "پایان";
}));
}
else
{
progressBar1.BeginInvoke(new Action(() =>
{
progressBar1.Value += 1;
//lblStatus.ForeColor = Color.DarkGray;
lblStatus.Text = $"در حال جستجو: {ip}";
//listVAddr.Items.Add(new ListViewItem(new String[] { ip, "", "قطع" }));
if (progressBar1.Value == 253)
lblStatus.Text = "پایان";
}), token);
}
}

//if (cancel)
//{
// lblStatus.Text = "پایان";

// cancel = false;
//}
}), token);

ShayanFiroozi
پنج شنبه 31 فروردین 1402, 01:53 صبح
سلام ،

روش شما تا حدودی منسوخ شده هست ، البته بستگی داره به اینکه شما از چه نسخه ای از دان نت فریم ورک استفاده میکنین ،

من یه کد نمونه رو برای شما نوشتم ، فقط در نظر داشته باشین که چون دیر وقت بود زیاد روش وقت نذاشتم ! و اینکه این کد با .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.");
}

پرستو پارسایی
پنج شنبه 31 فروردین 1402, 11:11 صبح
شاید این کد به شما کمک کنه

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