Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Как узнать IP адрес своего компьютера ?


Автор: ShadowDancer 25.1.2006, 11:53
Как узнать IP адрес своего компьютера ?

Автор: _hunter 25.1.2006, 12:49
поиском пользуемся
http://forum.vingrad.ru/index.php?showtopic=38714
http://forum.vingrad.ru/index.php?showtopic=13150

Автор: Spiker13 29.4.2006, 21:25
Ну, а если на прямую без сылок, то:
Код

uses Winsock;

function HostToIP(Name: string; var Ip: string): Boolean; 
var
  wsdata : TWSAData; 
  hostName : array [0..255] of char; 
  hostEnt : PHostEnt; 
  addr : PChar; 
begin 
  WSAStartup ($0101, wsdata); 
  try 
    gethostname (hostName, sizeof (hostName)); 
    StrPCopy(hostName, Name); 
    hostEnt := gethostbyname (hostName); 
    if Assigned (hostEnt) then 
      if Assigned (hostEnt^.h_addr_list) then begin 
        addr := hostEnt^.h_addr_list^; 
        if Assigned (addr) then begin 
          IP := Format ('%d.%d.%d.%d', [byte (addr [0]), 
          byte (addr [1]), byte (addr [2]), byte (addr [3])]); 
          Result := True;
        end
        else
          Result := False;
      end
      else
        Result := False
    else begin
      Result := False;
    end;
  finally
    WSACleanup;
  end
end;

Function ReadComputerName:string;
var
 i:DWORD;
 p:PChar;
begin
 i:=255;
 GetMem(p, i);
 GetComputerName(p, i);
 Result:=String(p);
 FreeMem(p);
end;

procedure TForm1.FormCreate(Sender: TObject);
var IP: string;
begin
if HostToIp(ReadComputerName, IP) then Label1.Caption := IP;
end;

 

Автор: vood 30.4.2006, 00:55
Код

uses WINSOCK;
...
function ip:string;
var 
 WSAData: TWSAData;
 p: PHostEnt; 
 Name: array[0..$FF] of Char; 
begin 
 WSAStartup($0101, WSAData); 
 GetHostName(name, $FF); 
 p := GetHostByName(Name); 
result:=inet_ntoa(PInAddr(p.h_addr_list^)^);
 WSACleanup; 
end;

 

Автор: Flat 7.5.2006, 16:27
проверил вариант вуда.... работает... но берет ип тока с сетевой карты.. а как быть с pppoe(которое я юзаю ) и vpn? 

Автор: Poseidon 7.5.2006, 17:36
Цитата(Flat @  7.5.2006,  16:27 Найти цитируемый пост)
а как быть с pppoe(которое я юзаю ) и vpn?


Код
//...
interface

uses
  {...}, Winsock;

{Экспортируем функцию из WinSock 2 (WS2_32.DLL)}
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;

{ обьявляем необходимые нам типы }
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
{$R *.dfm}

function EnumInterfaces(var sInt: string): Boolean;
var s: TSocket;
  wsaD: WSADATA;
  NumInterfaces: Integer;
  BytesReturned: 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;  
        sInt := sInt + #13#10;
      end;
    end;
  except  
  end;  
//  
// Закрываем сокеты
//  
  CloseSocket(s);  
  WSACleanUp;  
  result := false;
end;  


Использование:

Код
var tmp: string;
begin
EnumInterfaces(tmp);
ShowMessage(tmp);
end;

  

Автор: ReGeDiT 28.11.2008, 13:39
Цитата(Poseidon @ 7.5.2006,  18:36)
Цитата(Flat @  7.5.2006,  16:27 Найти цитируемый пост)
а как быть с pppoe(которое я юзаю ) и vpn?


Код
//...
interface

uses
  {...}, Winsock;

{Экспортируем функцию из WinSock 2 (WS2_32.DLL)}
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;

{ обьявляем необходимые нам типы }
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
{$R *.dfm}

function EnumInterfaces(var sInt: string): Boolean;
var s: TSocket;
  wsaD: WSADATA;
  NumInterfaces: Integer;
  BytesReturned: 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;  
        sInt := sInt + #13#10;
      end;
    end;
  except  
  end;  
//  
// Закрываем сокеты
//  
  CloseSocket(s);  
  WSACleanUp;  
  result := false;
end;  


Использование:

Код
var tmp: string;
begin
EnumInterfaces(tmp);
ShowMessage(tmp);
end;

спасибо! очень помогло! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)