نمایش نتایج 1 تا 3 از 3

نام تاپیک: کد مربوط به IP Scanner

  1. #1

    کد مربوط به IP Scanner

    دوستان سلام. من خیلی جستجو کردم یه کد خوب درباره اسکنر شبکه پیدا کنم اما متاسفانه جز کد زیر که خیلی هم کند هستش و یکی دو مورد دیگه چیزی زیادی گیرم نیومد.
    ممنون میشم از دوستان راهنمایی کنن .


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

  2. #2
    کاربر دائمی آواتار ShayanFiroozi
    تاریخ عضویت
    شهریور 1397
    محل زندگی
    بندرعباس ، خلیج همیشه فارس
    سن
    39
    پست
    226

    Lightbulb نقل قول: کد مربوط به 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.");
    }
    آخرین ویرایش به وسیله ShayanFiroozi : پنج شنبه 31 فروردین 1402 در 15:57 عصر دلیل: اضافه کردن Using ، تصحیح یگ باگ کوچیک در Reply پینگ

  3. #3
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    461

    نقل قول: کد مربوط به 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}");
    }
    }
    }
    }

تاپیک های مشابه

  1. سوال: نوشتن یک IP Scanner در دلفی
    نوشته شده توسط عقاب سیاه در بخش توسعه نرم افزارهای تحت شبکه
    پاسخ: 10
    آخرین پست: چهارشنبه 03 اسفند 1390, 19:55 عصر
  2. سوال: روش دريافت اطلاعات scanner?
    نوشته شده توسط saeidi.yusuf در بخش برنامه نویسی مبتنی بر Microsoft .Net Framework
    پاسخ: 6
    آخرین پست: یک شنبه 28 شهریور 1389, 14:23 عصر
  3. ip scanner
    نوشته شده توسط explod_javad در بخش VB.NET
    پاسخ: 3
    آخرین پست: دوشنبه 20 اسفند 1386, 09:28 صبح
  4. scanner.ocx(scanner ActiveX Control) VB6.0
    نوشته شده توسط liaghat در بخش برنامه نویسی در 6 VB
    پاسخ: 2
    آخرین پست: شنبه 27 بهمن 1386, 10:58 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •