Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать свой ай-пишник?


Alexey Romanskiy ©   (2004-12-23 20:26:00) 

Как можно узнать ай-пишник компа, на котором запущена прога?


XProger   (2004-12-27 18:34:00) [1]

Ну, это я так, для общего образования :)


able   (2004-12-27 07:15:00) [2]

XProger ©   (27.12.04 3:49) [8]
able, тогда он будет брать последий IP в очереди сетевых интерфейсов :)
т.е. вот я сижу щас у меня 3 IP адреса
127.xxx.xxx.xxx - я его тож за IP считаю ;)
0 10.0.2.65
1 212.248.15.42

Твой код возьмёт последний из них, ибо цикл у тебя стоит там :)

Я привел лишь пример.


XProger   (2004-12-27 03:49:00) [3]

able, тогда он будет брать последий IP в очереди сетевых интерфейсов :)
т.е. вот я сижу щас у меня 3 IP адреса
127.xxx.xxx.xxx - я его тож за IP считаю ;)
0 10.0.2.65
1 212.248.15.42

Твой код возьмёт последний из них, ибо цикл у тебя стоит там :)


able   (2004-12-25 16:43:00) [4]

а мне не сложно:

function LocalIP: String;
type
 TaPInAddr = Array[0..10] of PInAddr;
 PaPInAddr = ^TaPInAddr;
var
 phe: PHostEnt;
 pptr: PaPInAddr;
 Buffer: Array[0..63] of Char;
 I: Integer;
 GInitData: TWSAData;
begin
 WSAStartup($101, GInitData);
 Result := '';
 GetHostName(Buffer, SizeOf(Buffer));
 phe := GetHostByName(buffer);
 if phe = nil then Exit;
 pPtr := PaPInAddr(phe^.h_addr_list);
 I := 0;
 while pPtr^[I] <> nil do
  begin
   Result := inet_ntoa(pptr^[I]^);
   Inc(I);
  end;
 WSACleanup;
end;


Piter   (2004-12-25 14:15:00) [5]

На такие вопросы надо отсылать в FAQ и тему закрывать.


Ozone   (2004-12-25 05:51:00) [6]

Eraser ©   (23.12.04 21:45) [2]

Зачем так заморачиваться, если есть библиотека IPHLPAPI? (гке можно за один прогон цикла узнать всю инфу о всех сетевых интерфейсах)


Eraser   (2004-12-23 22:00:00) [7]

А я про что ;-)))


VMcL   (2004-12-23 21:56:00) [8]

>> Alexey Romanskiy  (23.12.04 20:26)

У компьютера нет IP-адреса. Оный есть только у сетевых интерфейсов.


Eraser   (2004-12-23 21:45:00) [9]

или
код компонента:

unit alxUSock;

interface

uses Windows, Winsock;

{

 Åñëè Âû ïîìåñòèòå ñòðîêó ðåçóëüòàòîâ â wide TMEMO (â åãî ñâîéñòâî memo.lines.text)
 òî íèêàêèõ ðåçóëüòàòîâ íå óâèäèòå.

 Òåñòèðîâàëîñü íà Win98/ME/2K, 95 OSR 2 è NT service
 pack #3 , ïîòîìó ÷òî èñïîëüçóåòñÿ WinSock 2 (WS2_32.DLL)

}

function EnumInterfaces(var sInt: string): Boolean;

{ ôóíêöèÿ WSAIOCtl èìïîðòèðóåòñÿ èç Winsock 2.0 - Winsock 2 äîñòóïåí }
{ òîëüêî â Win98/ME/2K è 95 OSR2, NT srv pack #3 }

function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen:
 DWORD;
 lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
 lpdwOutBytesReturned: LPDWORD;
 lpOverLapped: POINTER;
 lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL';

{ Êîíñòàíòû âçÿòûå èç çàãîëîâêà C ôàéëîâ }

const SIO_GET_INTERFACE_LIST = $4004747F;
 IFF_UP = $00000001;
 IFF_BROADCAST = $00000002;
 IFF_LOOPBACK = $00000004;
 IFF_POINTTOPOINT = $00000008;
 IFF_MULTICAST = $00000010;

type sockaddr_gen = packed record
   AddressIn: sockaddr_in;
   filler: packed array[0..7] of char;
 end;

type INTERFACE_INFO = packed record
   iiFlags: u_long; // Ôëàãè èíòåðôåéñà
   iiAddress: sockaddr_gen; // Àäðåñ èíòåðôåéñà
   iiBroadcastAddress: sockaddr_gen; // Broadcast àäðåñ
   iiNetmask: sockaddr_gen; // Ìàñêà ïîäñåòè
 end;

implementation

{-------------------------------------------------------------------

1. Îòêðûâàåì WINSOCK
2. Ñîçäà¸ì ñîêåò
3. Âûçûâàåì WSAIOCtl äëÿ äîñòóïà ê ñåòåâûì èíòåðôåéñàì
4. Äëÿ êàæäîãî èíòåðôåéñà, ïîëó÷àåì IP, MASK, BROADCAST, ñòàòóñ
5. Ðàçäåëÿåì ñòðîêó ñèìâîëîì CRLF  
6. Êîíåö :)

--------------------------------------------------------------------}

function EnumInterfaces(var sInt: string): Boolean;
var s: TSocket;
 wsaD: WSADATA;
 NumInterfaces: Integer;
 BytesReturned, SetFlags: u_long;
 pAddrInet: SOCKADDR_IN;
 pAddrString: PCHAR;
 PtrA: pointer;
 Buffer: array[0..20] of INTERFACE_INFO;
 i: Integer;
begin
 result := true;                                // Èíèöèàëèçèðóåì ïåðåìåííóþ
 sInt := '';

 WSAStartup($0101, wsaD);                      // Çàïóñêàåì WinSock
                                               // Çäåñü ìîæíî äàáàâèòü ðàçëè÷íûå îáðàáîò÷èêè îøèáêè :)

 s := Socket(AF_INET, SOCK_STREAM, 0);          // Îòêðûâàåì ñîêåò
 if (s = INVALID_SOCKET) then exit;

 try                                            // Âûçûâàåì WSAIoCtl
   PtrA := @bytesReturned;
   if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil,
     nil)
      SOCKET_ERROR)
     then
   begin                                        // Åñëè OK, òî îïðåäåëÿåì êîëè÷åñòâî ñóùåñòâóþùèõ èíòåðôåéñîâ

     NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);

     for i := 0 to NumInterfaces-1 do        // Äëÿ êàæäîãî èíòåðôåéñà
     begin
       pAddrInet := Buffer[i].iiAddress.addressIn;            // IP àäðåñ
       pAddrString := inet_ntoa(pAddrInet.sin_addr);
       sInt:=sInt+pAddrString;
       if i=NumInterfaces-1 then
         sInt := sInt
       else
         sInt := sInt + #13#10;
       // CRLF ìåæäó êàæäûì èíòåðôåéñîì
     end;
   end;
 except
 end;
//
// Çàêðûâàåì ñîêåòû
//
 CloseSocket(s);
 WSACleanUp;
 result := false;
end;

end.


Anatoly Podgoretsky   (2004-12-23 21:04:00) [10]

127.0.0.1


Наверх

Титульная страница Поиск, карта сайта Написать письмо