الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

معرفة عنوان ال IP للحاسب المحلي

مغلق
بدأه magellan في 9 يونيو 2006 · 2 رد · 1,023 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

معرفة عنوان الـ IP للحاسب المحلي حاجة تقتضيها كتابة برامج تتعامل مع الشبكة وطبعاً هناك أكثر من طريقة لفعل ذلك في دلفي .

طريقة أولى :

من المعروف لدى من لديهم خبرة جيدة في الشبكات أن عنوان الـ IP وقناع الشبكة بالإضافة إلى الكثير من قيم و إعدادات الـ TCP/IP هي قيم مخزنة في الريجستري – هذه المعلومة قد تكون مفاجئة للبعض لكنها الحقيقة - مايهمنا الآن هو عنوان الـ IP وهو موجود في المسار التالي :

HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters\Interfaces\<adapter>.

يمكنك تجريب ذلك على حاسبك ، وستجد الكثير من القيم الأخرى أيضاً . وطبعاً طالما عرفنا المسار فإنه من السهل كتابة إجرائية بسيطة لقراءة هذه القيمة من الريجستري – وهذه سأتركها لكم –

لكن هذه الطريقة على بساطتها إلا أنها غير محبذة وهي بالتأكيد ليست أفضل الطرق.

الطريقة الثانية:

للحصول على معلومات عن tcp/ip فإن تطبيقات windows Sockets تستخدم بنية WSAData والتي نحصل عليها من خلال استدعاء التابع WSAStartup المسؤول عن بدء عملية Windows Socket DLL Proccess

ما هي WSAData

ما هي WSAData

typedef struct WSAData {  
		WORD					wVersion; 
		WORD					wHighVersion;  
		char						 szDescription[WSADESCRIPTION_LEN];		
		char						 szSystemStatus[WSASYS_STATUS_LEN+1];  
		unsigned short		 iMaxSockets;  
		unsigned short		 iMaxUdpDg;  
		char FAR *			 lpVendorInfo;  
} WSADATA, FAR * LPWSADATA;

WSAStartup (  



	WORD				  wVersionRequested,		 

	LPWSADATA	  lpWSAData		  

   );

المتحول الأول wVersionRequested هو متحول دخل In وهو يعبر عن رقم النسخة الأعلى التي يمكن لهذه الـ Windows Socket أن تتدعمها حيث أن البايت الأعلى يمثل رقم النسخة الثانوي minor بينما البايت اللأدنى يمثل رقم النسخة الرئيسي major . ونظراً لأهمية هذا الموضوع نورد فيما يلي جدولاً يوضح القيم المطلوبة وفقأ لكل نسخة .

http://iss.almoja.net/artimg/Delphi&ip_1.gif

مثلاً لو أردنا أردنا برنامج دلفي يدعم الاصدار الثاني Windows Socket Version 2

يمكننا كتابة التالي:

Var   
	 Wsdata:Twsdata;  
	  Err:integer;

ثم أثناء استدعاء التابع WSAStartup نكتب التالي:

Err:=Wsastartup (MAKEWORD( 2, 0 ), Wsdata);
If (Err <> 0 ) then
ShowMessage (‘Couldn't find a Compatible WinSock DLL’);

المتحول الثاني هو متحول خرج Out وهو مؤشر إلى WSAData التي سوف تتلقى - من خلال البنية - التي تم عرضها سابقاً تفاصيل الـ Windows Socket التي سيتم تطبيقها من خلال استدعاء التابع WSAStartup. الآن إذا أردنا مثال عملي في دلفي .

uses winsock; 
//-----------------------------------------------
function GetMyIP :string;
var
   WSDATA : TWSAData;
   HE : PHostEnt;
   pc:PChar;
   ip:TInAddr;
   i:Cardinal;
   mypc:string;
begin
i:= MAX_COMPUTERNAME_LENGTH + 1;
SetLength(mypc,i);
GetComputerName(pchar(mypc),i);
WSAStartup(MakeWord(1,1),WSDATA);
HE := gethostbyname(pchar(mypc));
if he<>nil then
begin
ip.S_addr:= integer(pointer (HE^.h_addr_list^)^);
pc:=inet_ntoa(ip);
result:=string(pc);
end;
WSACleanup();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:= GetMyIP;
end;

منقول من iss.almoja.net

Magelaan B) B)

#2

ابداااع

موضوع جداً مهم ..

مشكوووووور على الطريقتين ;)

#3

شكرا لمرورك الجميل

والشكر لصاحب الموضوع الاصلي

تم تعديل هذه المشاركة بواسطة magellan في 9 يونيو 2006 في 20:05

هذا الموضوع مغلق.

مواضيع مشابهة