GetIPs V0.1 بريمج صغير لجلب ال IP
#1
السلام عليكم و رحمة الله و بركاته 
اتمنى ان يكون الجميع بخير 
اول مشاركة نافعة لي في المنتدى , منذ سجلت و أنا أسأل  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
ارحب بكل الاقتراحات و التعديلات و الانتقادات
السورس في المرفقات


الملفات المرفقة
.rar   GetIPs v0.1.rar (الحجم : 3.59 KB / التحميلات : 32)
[-] كل من 1 user says قال شكرا ل Rever7eR على المشاركة المفيدة
  • أبو معاذ
الرد
#2
السلام عليكم 
يمكنك استعمال Indy ايضا للحصول على الايبي الداخلي


الملفات المرفقة
.zip   GetIPs v0.2.zip (الحجم : 2.87 KB / التحميلات : 25)
:: من يملك المعلومة يملك الميدان :: 
[-] كل من 2 users say قال شكرا ل AX302 على المشاركة المفيدة
  • Rever7eR, أبو معاذ
الرد
#3
(30-03-2020, 11:18 PM)AX302 كتب : السلام عليكم 
يمكنك استعمال Indy ايضا للحصول على الايبي الداخلي
مرحبا AX302 سعيد بمشاركتك 
نفس الملاحظة بالنسبة لمكون الاندي , لا يعمل جيدا اذا كان جهازك يحتوي على كروت انترنت افتراضية مثل VMware ... 
اظن الحل هو الحفاظ على استعمال الوحدة winsock و الله اعلم .
[+] اعجبتني فكرة تقسيم المشروع الى وحدات
تحياتي
الرد
#4
الحل السريع للحصول على عنوان 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.


.zip   MyIPAdress.zip (الحجم : 247.21 KB / التحميلات : 18)
[-] كل من 1 user says قال شكرا ل seddik_xp على المشاركة المفيدة
  • أبو معاذ
الرد
#5
إقتباس :[-] البرنامج يفشل في تحديد ال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
الرد
#6
وعليكم السلام
ممكن أن تضيف خصية اظهار الـ 'IP' الخارجي المتصل  بالكميوتر لكشف  الـ 'IP'  المشبوهة
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف