delphi4arab منتديات دلفي للعرب

نسخة كاملة : GetIPs V0.1 بريمج صغير لجلب ال IP
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم و رحمة الله و بركاته 
اتمنى ان يكون الجميع بخير 
اول مشاركة نافعة لي في المنتدى , منذ سجلت و أنا أسأل  Big Grin
قمت بعمل بريمج صغير يقوم ب
[+] جلب Local IP address  
[+] جلب ال  Public IP Address  
سأقوم ان شاء الله بعمل دورية كل مدة لإضافة خاصية معينة و اصلاح السورس 
لكل شخص يريد تطويره يتفضل مشكور
الهدف منه : تحسين مهارات التعامل مع الشبكة و مكوناتها بشكل عام
ملاحظات بسيطة : 
شاهدت موضوع للأخ Delphi4US جزاه الله خير وضع بريمج مفتوح المصدر مطابق لما قمت به 

كود :
https://delphi4arab.net/forum/showthread.php?tid=10414
بعد الاطلاع على السورس وجدت انه
[-] طويل دون فائدة
[-] البرنامج لا يوجد به معالجة للاخطاء (Error Handling)
[-] البرنامج يفشل في تحديد الLocal IP Address في حالة وجود أكثر من Network Adapter مثلا انا لدي 
VMware ipv4 = 192.168.219.1 و ال Wifi adapter ipv4 = 192.168.1.3 كما توضح الصورة
 
[صورة: aYVvwwT.png]
نفس الملاحظة بالنسبة لمكون tcpclient يرجع الاي بي 192.168.219.1
ارحب بكل الاقتراحات و التعديلات و الانتقادات
السورس في المرفقات
السلام عليكم 
يمكنك استعمال Indy ايضا للحصول على الايبي الداخلي
(30-03-2020, 11:18 PM)AX302 كتب : [ -> ]السلام عليكم 
يمكنك استعمال Indy ايضا للحصول على الايبي الداخلي
مرحبا AX302 سعيد بمشاركتك 
نفس الملاحظة بالنسبة لمكون الاندي , لا يعمل جيدا اذا كان جهازك يحتوي على كروت انترنت افتراضية مثل VMware ... 
اظن الحل هو الحفاظ على استعمال الوحدة winsock و الله اعلم .
[+] اعجبتني فكرة تقسيم المشروع الى وحدات
تحياتي
الحل السريع للحصول على عنوان IP و بدون أي مشاكل في إستعمال خدمة Opendns server كخادم dns ليجيبك عند إستعلامك عن عنوان 'myip.opendns.com' بعنوان IP الخاص بك.

كود :
program MyIPAdress; {$APPTYPE CONSOLE} uses   SysUtils, IdDNSResolver ; var dns :TIdDNSResolver ; begin   dns := TIdDNSResolver.Create ;   dns.QueryType:= [qtA];   dns.Host := '208.67.222.222' ;   try   dns.Resolve('myip.opendns.com');   Writeln('IP Adress :' + TARecord(dns.QueryResult[0]).IPAddress);   except     on E: Exception do       Writeln(E.ClassName, ': ', E.Message);   end;   Readln; end.

[attachment=4210]
إقتباس :[-] البرنامج يفشل في تحديد الLocal IP Address في حالة وجود أكثر من Network Adapter




الأوامر التي استعملتها في تطبيقك و ضعتها بطريقة خاطئة:

هنا الدالة ترجع نوع string

كود :
Function GetLocalIP : String;
بمعنى انه بعد المعالجة سوف يتم ارجاع قيمة نصية واحدة.



في اوامر مثالك، هنا حلقة تقوم بحفظ ما تم جلبه في result، الحلقة تدور بعدد ما تم تحديده من Network Adapters النشطة (Enabled). و الحفظ يوضع في نفس الــ string في كل مرة (هنا الخطأ).

كود :
      while IPlist[i] <> nil do         begin          result := inet_ntoa(IPList^[i]^);          Inc(i);         end;
مما سوف يؤدي الى استبدال في الذاكرة المحجوزة ما تم حفظه اول مرة بالقيمة التالية و هكذا... الى انتهاء دوران الحلقة و تحصل فقط على آخر قيمة تم حفظها...

احد الحلول المتوفرة، تعديل الأوامر الى:
result يجب ان يكون نوع نصي يمكنه احتواء قائمة نصية ثم اظهار محتواها في مكون يدعم القوائم و ليس مكون من نوع TEdit
وعليكم السلام
ممكن أن تضيف خصية اظهار الـ 'IP' الخارجي المتصل  بالكميوتر لكشف  الـ 'IP'  المشبوهة