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


Автор: Romany4 20.9.2009, 10:45
Как определить ip адрес pppoe соединения, для его дальнейшего использования в программе?

В общем, подключаюсь к сети через PPPoE, разрешаю доступ только к определённым сетям с помощью батника типа:

Код

@SET GATEWAY=212.42.XXX.XXX
@route add 0.0.0.0 mask 0.0.0.0 %GATEWAY%
@route delete 0.0.0.0

@route add 212.112.96.0 mask 255.255.224.0 %GATEWAY%
@route add 195.38.160.0 mask 255.255.224.0 %GATEWAY%
... 
и так далее


Хочу, сделать програмку, которая бы висела в трее и назначала заранее указанные маршруты, присвоенные определенным кнопкам.

Пока остановился на вызовe route.exe через shellexecute с параметрами, но появилась проблема с определением шлюза (моего IP). Можно было бы его сразу прописать, но он динамический у меня :( 
Вот собственно и ключевой вопрос: как получить этот самый текущий IP?

Автор: former 20.9.2009, 11:23
Я использую этот код:
Код

Uses WinSock;

function TForm1.GetLocalIP:AnsiString;
const WSVer=$202;
var wsaData:TWSAData;
    P:PHostEnt;
    Buf:array [0..127] of Char;
begin
  Result:='';
  if WSAStartup(WSVer,wsaData)=0 then
  begin
    if GetHostName(@Buf,128)=0 then
    begin
      P:=GetHostByName(@Buf);
      if P <> nil then Result:=AnsiString(iNet_ntoa(PInAddr(p^.h_addr_list^)^));
    end;
    WSACleanup;
  end;
end;


А вообще, http://forum.vingrad.ru/index.php?forums=86&cat_forum=forum_id&act=Search&joinname=1&CODE=do_and_show_extern_search&keywords=IP.

Автор: Romany4 20.9.2009, 16:22
Цитата
Я использую этот код:


Эта функция вернет нам локальный IP, а мне нужен IP активного соединения pppoe.



Автор: Keeper89 20.9.2009, 17:24
Romany4, гляньте http://msdn.microsoft.com/en-us/library/aa365915%28VS.85%29.aspx.

Автор: former 20.9.2009, 17:50
Цитата(Romany4 @  20.9.2009,  16:22 Найти цитируемый пост)
Эта функция вернет нам локальный IP, а мне нужен IP активного соединения pppoe.

Чего, чего? У меня IP в интернет соединении (pppoe) получается от провайдера автоматически при каждом подключении. Эта функция его определяет 100%.

Автор: Romany4 21.9.2009, 04:01
Цитата(former @  20.9.2009,  17:50 Найти цитируемый пост)
Чего, чего? У меня IP в интернет соединении (pppoe) получается от провайдера автоматически при каждом подключении. Эта функция его определяет 100%.

Хорошо, хорошо. Эта функция МНЕ возвращает мой локальный IP. Не 127.0.0.1, а тот, который я прописал сам в свойствах TCP/IP.


Keeper89,  спасибо, гляну.

Автор: dvamaster 21.9.2009, 09:12
UPnP

http://msdn.microsoft.com/en-us/library/aa382303(VS.85).aspx

тут не особо пнятно и на Basic

http://www.knoxscape.com/Upnp/NAT.htm

Добавлено через 1 минуту и 1 секунду
Как чего не пробовал, но всяческие торрент-клиенты и др. проги его пользуют

Автор: Romany4 22.9.2009, 14:52
Спасибо всем за участие, нашел такой код, который справился с поставленной задачей:

Код

uses
  Windows, Winsock;
 
.....
 
{ функция 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;
 
 
function GetPPPIP: In_addr;
var
  s: TSocket;
  wsaD: WSADATA;
  NumInterfaces: Integer;
  BytesReturned, SetFlags: u_long;
  PtrA: pointer;
  Buffer: array[0..20] of INTERFACE_INFO;
  i: Integer;
begin
  result.S_addr := 0; // Инициализируем переменную
 
  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
        SetFlags := Buffer[i].iiFlags;
        if ((SetFlags and IFF_POINTTOPOINT) = IFF_POINTTOPOINT) and
           ((SetFlags and IFF_UP) = IFF_UP) then
        Begin
          Result := Buffer[i].iiAddress.addressIn.sin_addr;
          Break;
        End;
      end;
  end;
  except
  end;
  CloseSocket(s);
  WSACleanUp;
end;

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