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

نام تاپیک: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

  1. #1
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    تیر 1386
    محل زندگی
    شهيد محلاتي
    پست
    79

    مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    با سلام خدمت اساتید برنامه نویس
    لطفا کد برنامه اینجانب را بررسی نموده و نظرات خود را در خصوص بهترین مکانیزم اجرای این عملیات را بیان نمایید.
    توضیح اینکه :
    1- این برنامه از سرعت خوبی برخوردار نمی باشد.
    2- در هنگام اجرای عملیات نمی توان با دیگر اجزای فرم کار کرد ویا حتی برنامه را بست و با هشدار NotResponding مواجه میشود.
    3- برای توسعه این برنامه از کامپوننت IndyIdIcmp استفاده کرده ام.

    procedure TForm1.btnPingClick(Sender: TObject);
    Var
    S, temp: String;
    I, value, k: Integer;
    a: array [0 .. 3] of Integer;
    begin
    temp := '';
    I := 0;
    S := edt_PING_IpAddress.Text;
    while Length(S) > 3 do
    Begin
    inc(I);
    temp := Copy(S, 1, Ansipos('.', S) - 1);
    delete(S, 1, 4);
    val(temp, value, k);
    if value = 0 then
    begin
    MessageDlg('Please correct Ip Adress!.', mtError, mbOKCancel, 0);
    Exit;
    end;
    a[I] := value;
    End;
    temp := IntToStr(a[1]) + '.' + IntToStr(a[2]) + '.' + IntToStr(a[3]) + '.';
    for I := 1 to 254 do
    begin
    try
    Application.ProcessMessages;
    IndyICMP_PING.Host := temp + IntToStr(I);
    IndyICMP_PING.ReceiveTimeout := 100;
    IndyICMP_PING.Ping();
    Application.ProcessMessages;
    Except
    lst_PING_Reply.Items.Append('Host Not Avalable');
    end;
    end;
    end;



    function PingReplyStatus(const AReplyStatus: TReplyStatus): string;
    begin
    Application.ProcessMessages;
    case AReplyStatus.ReplyStatusType of
    rsEcho:
    begin
    Result := (format('response from host %s in %d millisec.',
    [AReplyStatus.FromIpAddress,
    AReplyStatus.MsRoundTripTime]));
    end;
    rsError:
    Result := ('Unknown error.');
    rsTimeOut:
    Result := ('Timed out.');
    rsErrorUnreachable:
    Result := (format('Host %s reports destination network unreachable.',
    [AReplyStatus.FromIpAddress]));
    rsErrorTTLExceeded:
    Result := (format('Hope %d %s: TTL expired.',
    [AReplyStatus.FromIpAddress]));
    end;
    end;

    procedure TForm1.IndyICMP_PINGReply(ASender: TComponent;
    const AReplyStatus: TReplyStatus);
    begin
    lst_PING_Reply.Items.Append(PingReplyStatus(AReply Status));
    end;


    آخرین ویرایش به وسیله hamidprogramer : سه شنبه 23 فروردین 1390 در 16:21 عصر

  2. #2

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    بهترين روش استفاده از آنتي فريزه خوده ايندي هست.
    و يه روش بهتر اينكه برنامت رو مالتي ترد كني.


  3. #3
    کاربر دائمی آواتار amirsadeghi
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    system32\amir.ocx
    پست
    514

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    من توی برنامه هام از کامپوننت ping استفاده می کنم. هم سرعت قابل قبولی داره هم اینکه میتونی چندتا روی فرم بزاری و بدون تاثیر توی سرعت برنامه یا حتی توی پینگ خودشون ازش استفاده کنی

  4. #4
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    تیر 1386
    محل زندگی
    شهيد محلاتي
    پست
    79

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    لطفا اگه نمونه برنامه ای دارید و یا یه لینکی که بشه ازش استفاده کرد رو بذارید توی این تاپیک.

  5. #5
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    تیر 1386
    محل زندگی
    شهيد محلاتي
    پست
    79

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    لطفا اگه میشه لینک این کامپوننت رو بذارید.

  6. #6

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    بهترين روش استفاده از آنتي فريزه خوده ايندي هست.
    بهترین روش نیست، ساده ترین روش هست.

    لطفا اگه میشه لینک این کامپوننت رو بذارید.
    IdAntiFreeze جزو کامپوننت های Indy هست، و با دلفی تون نصب شده. لازم نیست از جایی دانلودش کنید.

    1- این برنامه از سرعت خوبی برخوردار نمی باشد.
    2- در هنگام اجرای عملیات نمی توان با دیگر اجزای فرم کار کرد ویا حتی برنامه را بست و با هشدار NotResponding مواجه میشود.
    برنامه فریز میشه، چون اجرای Ping در Thread اصلی برنامه انجام میشه، و تا پایان اون کار، برنامه نمی تونه کار دیگه ایی انجام بده.
    پایین بودن سرعت هم به خاطر این هست که پینگ ها به ترتیب و پشت سر هم انجام میشند، در حالی که نیازی نیست که این کار پشت سر هم انجام بشه.

    راهکار اصولی اش اینه که یک مجموعه Thread به عنوان Worker Threads داشته باشید، که هر کدوم شون چندتا از آدرس ها را Ping کنند، و نتیجه رو به Thread اصلی اطلاع بدند. در اون صورت، چون در هر لحظه چند عمل Ping به طور همزمان انجام میشه، سرعت افزایش پیدا میکنه، و همچنین چون Thread اصلی درگیر عملیات Ping نمیشه، برنامه حالت فریز شده پیدا نمیکنه.

    حالا اینکه اصلا Thread چی هست، چه روش هایی برای تقسیم کار وجود داره، چطور باید یک مجموعه کار رو به چند Thread محدود داد، و بحث هایی از این قبیل، خودشون موضوعات جدای از Ping هستند، و به این تاپیک چندان مربوط نمیشند.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  7. #7

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    لطفا یه نمونه برنامه بذارید که که بدونیم چطور از این هدف نتیجه گیری کنیم.

  8. #8
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    تیر 1386
    محل زندگی
    شهيد محلاتي
    پست
    79

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    سلام
    من برنامه خودم رو با Thread نوشتم ولی ظاهراً این Thread اجرا نمیشه، لطفاً کد من رو بررسی کنید ببینیم چه مشکلی داره؟
    unit untPingThread;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Strutils, IdIcmpClient;

    type
    Thamidreza = class(TThread)
    private
    {Protected}
    Protected
    Procedure Execute; override;
    function Reply(): string;
    Public
    Ip,ReplyString: String;
    Procedure Result;
    end;

    Var
    IndyIcmp_ping: TIdIcmpClient;

    implementation
    {$R *.dfm}
    Procedure Thamidreza.Execute;
    Var
    I: integer;
    Begin
    for I := 1 to 254 do
    begin
    try
    IndyIcmp_ping.Create(Application);
    IndyIcmp_ping.Host := Ip;
    IndyIcmp_ping.ReceiveTimeout := 1000;
    IndyIcmp_ping.Ping();
    Synchronize(Result);
    Except
    //ReplyString := ('Host Not Avalable');
    end;
    end;
    end;

    function Thamidreza.Reply(): string;
    begin
    case IndyIcmp_ping.ReplyStatus.ReplyStatusType of
    rsEcho:
    begin
    Result := (format('Reply from %s :Time< %d millisec.',
    [IndyIcmp_ping.ReplyStatus.FromIpAddress, IndyIcmp_ping.ReplyStatus.MsRoundTripTime]));
    end;
    rsError:
    Result := ('Unknown error.');
    rsTimeOut:
    Result := ('Timed out.');
    rsErrorUnreachable:
    Result := (format('Host %s reports destination network unreachable.',
    [IndyIcmp_ping.ReplyStatus.FromIpAddress]));
    rsErrorTTLExceeded:
    Result := (format('Hope %d %s: TTL expired.',
    [IndyIcmp_ping.ReplyStatus.FromIpAddress]));
    end;
    end;

    Procedure Thamidreza.Result;
    Begin
    ReplyString := Reply();
    End;
    {------------------------------------------------------}
    procedure TForm1.btnPingClick(Sender: TObject);
    var
    h:Thamidreza;
    begin
    h:=Thamidreza.Create(true);
    h.Ip := GetIpfromEditbox(edt_PING_IpAddress.Text);
    h.FreeOnTerminate := True;
    h.Resume;
    lst_PING_Reply.Items.Append(h.ReplyString);
    end;

  9. #9

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    من برنامه خودم رو با Thread نوشتم ولی ظاهراً این Thread اجرا نمیشه، لطفاً کد من رو بررسی کنید ببینیم چه مشکلی داره؟
    Thread اجرا میشه، اما کد شما مشکل داره؛ چون انتظار دارید بلافاصله بعد از Resume شدن Thread، در خط بعدی، ReplyString مقدار داشته باشه، در حالی که این دو Thread به طور مستقل از هم اجرا میشند، و شما در Thread اصلی نمیدونید که کی Thread دوم نتیجه عملیاتش را برگشت میده. در یک نرم افزار Multi-threaded کد ها به موازات هم اجرا میشند، نه پشت سر هم. Thread شما باید هر زمان که نتیجه عملیاتش مشخص شد، Thread اصلی رو با خبر کنه، تا Thread اصلی نتیجه را بگیره و به کاربر نمایش بده. می تونید از یک Critical Section یا یک Event برای با خبر کردن Thread اصلی استفاده کنید، که البته در اون صورت، Thread اصلی تا رسیدن پیام منتظر میمونه، و برنامه تون همچنان حالت فریز پیدا میکنه. بهترش اینه که به جای منتظر ماندن، Thread شما فقط یه پیام برای Thread اصلی ارسال کنه، و Thread اصلی هر زمان که پیام مربوطه رسید، واکنش نشون بده.

    در ضمن، در این کدی که نوشتید، Thread شما 254 بار یک IP رو Ping میکنه! در حالی که باید در هر بار اجرای حلقه، مقدار IP افزایش پیدا کنه، تا 254 نود مختلف را پینگ کنه. نکته بعدی اینکه استفاده از Synchronize در کدی که نوشتید، لزومی نداره.

    نکته آخر اینکه، این کد اگر به درستی نوشته بشه، مشکل فریز شدن برنامه تون رو حل میکنه، ولی تاثیر چندانی روی افزایش سرعت عملیان پینگ نداره، چون در Thread دوم، همچنان پینگ ها پشت سر هم انجام میشند، نه به طور همزمان. البته ممکنه الان فکر کنید، اگر 254 Thread مختلف درست کنید، و با هر کدوم یه پینگ ارسال کنید، مشکل حل میشه، ولی ایجاد این تعداد Thread و ارسال 254 پینگ به طور همزمان باعث کاهش کارایی برنامه و شبکه تون میشه، بلکه باید تعداد پینگ های همزمان را محدود کنید، و در هر لحظه تعداد مشخصی پینگ بفرستید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  10. #10
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    تیر 1386
    محل زندگی
    شهيد محلاتي
    پست
    79

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    من هرچه سعی کردم نتونستم حتی یک showmessage بعد از پایان Thread در برنامه ام دریافت کنم چه برسه به ReplyString.
    لطفاً من رو راهنمایی کنین ببینم چه جور میشه وقتی Thread کارش تموم شد یه پیغام به کاربر نمایش داده بشه یا هر چیزه دیگه ای؟

  11. #11

    نقل قول: مکانیزم صحیح ping کردن یک range از ip در یک شبکه محلی

    نقل قول نوشته شده توسط hamidprogramer مشاهده تاپیک
    من هرچه سعی کردم نتونستم حتی یک showmessage بعد از پایان Thread در برنامه ام دریافت کنم چه برسه به ReplyString.
    لطفاً من رو راهنمایی کنین ببینم چه جور میشه وقتی Thread کارش تموم شد یه پیغام به کاربر نمایش داده بشه یا هر چیزه دیگه ای؟
    براتون یک نمونه نوشتم که داخل یک حلقه عددی رو محاسبه میکنه و وقتی کار Thread تموم شد به MainThread اطلاع میده تا نتیجه نمایش داده بشه ، از ضمیمه دریافت کنید .
    فایل های ضمیمه فایل های ضمیمه

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

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