معرفة عنوان الـ 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)