Как узнать IP клиента и IP сервера для активного RAS-подключения?

Материал из DRKB


uses Ras, RasError;

type
  TRASIP = record
    dwSize: DWORD;
    dwError: DWORD;
    szIpAddress: packed array[0..RAS_MaxIpAddress] of AnsiChar;
    szServerIpAddress: packed array[0..RAS_MaxIpAddress] of AnsiChar;
  end;

procedure GetDialUpIpAddress(var server, client: string);
var
  RASPppIp: TRASIP;
  lpcp: DWORD;
  ConnClientIP: array[0..RAS_MaxIpAddress] of Char;
  ConnServerIP: array[0..RAS_MaxIpAddress] of Char;

  Entries: PRasConn;
  BufSize, NumberOfEntries, Res: DWORD;
  RasConnHandle: THRasConn;
begin
  New(Entries);
  BufSize := Sizeof(Entries^);
  ZeroMemory(Entries, BufSize);
  Entries^.dwSize := Sizeof(Entries^);

  Res := RasEnumConnections(Entries, BufSize, NumberOfEntries);
  if Res = ERROR_BUFFER_TOO_SMALL then
  begin
    ReallocMem(Entries, BufSize);
    ZeroMemory(Entries, BufSize);
    Entries^.dwSize := Sizeof(Entries^);
    Res := RasEnumConnections(Entries, BufSize, NumberOfEntries);
  end;
  try
    if (Res = 0) and (NumberOfEntries > 0) then RasConnHandle := Entries.hrasconn else exit
  finally
    FreeMem(Entries);
  end;

  FillChar(RASPppIp, SizeOf(RASPppIp), 0);
  RASPppIp.dwSize := SizeOf(RASPppIp);
  lpcp := RASPppIp.dwSize;
  if RasGetProjectionInfo(RasConnHandle, RASP_PppIp, @RasPppIp, lpcp) = 0 then
  begin
    Move(RASPppIp.szServerIpAddress, ConnServerIP, SizeOf(ConnServerIP));
    Server := ConnServerIP;
    Move(RASPppIp.szIpAddress, ConnClientIP, SizeOf(ConnClientIP));
    client := ConnClientIP;
  end;
end;


Author: p0s0l
Source: http://forum.vingrad.ru
ID: 03355