Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2010, 13:17   #1
Onekey
Пользователь
 
Регистрация: 07.08.2010
Сообщений: 48
По умолчанию Определние локального ( внутреннего )IP

мм у меня есть внешний и локальный IP .внешний я определил ( через сайт типа myip.ru) а как можно внутренний IP узнать? ( ессесно программно)
Onekey вне форума Ответить с цитированием
Старый 07.08.2010, 13:37   #2
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Как-то я сталкивался с такой проблемой. Выход нашел в королевстве delphi. Ссылку я уже не помню, но код остался:
Код:
uses
  WinSock;

const
  WINSOCK_VERSION = $0101;

//определение имени своего компа
function GetLocalName: String;
var
WSAData: TWSAData;
Buf: array [0..127] of Char;
begin
Result := '';
if WSAStartup(WINSOCK_VERSION, WSAData) = 0 then
  begin
  if GetHostName(@Buf, SizeOf(Buf)) = 0 then
    begin
    Result := Buf;
    end;
  WSACleanup;
  end;
end;

//все следующие функции однотипные, только приведения типов данных там по-///разному реализовывается. Остаётся только выбрать одну за эталон

//определение своего IP. Либо можно GetLocalName и подставить в одну из следующих за этим функций.
function GetLocalIP: String;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
Buf: array [0..127] of Char;
begin
Result := '';
if WSAStartup(WINSOCK_VERSION, WSAData) = 0 then
  begin
  if GetHostName(@Buf, SizeOf(Buf)) = 0 then
    begin
    HostEnt := GetHostByName(@Buf);
    if HostEnt <> nil then Result := inet_ntoa(PInAddr(HostEnt^.h_addr_list^)^);
    end;
  WSACleanup;
  end;
end;

//следующие функции вообще идентичны
//определить IP по имени компа (можно использовать сокращенные или полные)
function GetIP2(LocalName: String): String;
var
WSAData: TWSAData;
SockAddrIn: TSockAddrIn;
HostEnt: PHostEnt;
begin
Result := '';
if WSAStartup(WINSOCK_VERSION, WSAData) = 0 then
  begin
  HostEnt := GetHostByName(@LocalName[1]);
  if HostEnt <> nil then
    begin
    SockAddrIn.sin_addr.S_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
    Result := inet_ntoa(SockAddrIn.sin_addr);
    end;
  WSACleanup;
  end;
end;

function HostToIP(name: String): String;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
addr: PChar;
begin
Result := '';
if WSAStartup(WINSOCK_VERSION, WSAData) = 0 then
  begin
  HostEnt := GetHostByName(@Name[1]);
  if HostEnt <> nil then
    if HostEnt^.h_addr_list <> nil then
    begin
      addr := HostEnt^.h_addr_list^;
      if addr <> nil then
      Result := Format('%d.%d.%d.%d', [Byte(addr[0]), Byte(addr[1]), Byte(addr[2]), Byte(addr[3])]);
    end;
  WSACleanup;
  end;
end;

//а эта чуть-чуть посложнее
function GetIPFromHost(const HostName: String): String;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
pptr: PaPInAddr;
i: Integer;
begin
Result := '';
if WSAStartup(WINSOCK_VERSION, WSAData) = 0 then
  begin
  HostEnt := GetHostByName(PChar(HostName));
  if HostEnt <> nil then
    begin
    pPtr := PaPInAddr(HostEnt^.h_addr_list);
    i := 0;
    while pPtr^[i] <> nil do
      begin
      Result := inet_ntoa(pptr^[i]^);
      Inc(i);
      end;
    end;
  WSACleanup;
  end;
end;

//а вот и обратное преобразование
//получить имя компа (ПОЛНОЕ! ДОМЕННОЕ) по его IP
function IPAddrToName(IPAddr: String): String;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
SockAddrIn: TSockAddrIn;
// IA: Longint; // internet address
begin
Result := '';
if WSAStartup(WINSOCK_VERSION, WSAData) = 0 then
  begin
  SockAddrIn.sin_addr.S_addr := inet_addr(PChar(IPAddr));
  {чтобы не писать ещё одну функцию
    вместо предыдущей строчки можно так:
  IA := inet_addr(PChar(AIP)); // переводим в internet address in IP's network order - и далее GetHostByAddr(@IA,..
    }
  HostEnt := GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
  if HostEnt <> nil then
    Result := StrPas(HostEnt^.h_name);
  WSACleanup;
  end;
end;
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 07.08.2010, 14:01   #3
Onekey
Пользователь
 
Регистрация: 07.08.2010
Сообщений: 48
По умолчанию

эм спасибо но не совсем то))
У меня провайдер предостваляет внешнею и локальную сеть
ТОесть получаеться есть внешний ип и есть внутренний ип.
Мне надо узнать внутренний ип
Onekey вне форума Ответить с цитированием
Старый 07.08.2010, 14:22   #4
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от Onekey Посмотреть сообщение
эм спасибо но не совсем то))
У меня провайдер предостваляет внешнею и локальную сеть
ТОесть получаеться есть внешний ип и есть внутренний ип.
Мне надо узнать внутренний ип
У меня почти аналогичная картина. У меня есть локалка, а интернет я получаю через VPN. Так вот: какая-то из функций получат ip локалки, а другая внешний ip... У меня все работало как надо)
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 08.08.2010, 01:13   #5
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Попробуйте компонент IdIPWatch, может поможет
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 08.08.2010, 09:59   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Onekey Посмотреть сообщение
а как можно внутренний IP узнать?
Это неправильный вопрос. Какой именно? Этих внутренних IP на машине может быть до чёрта. На моей сейчас их 3.

В любом случае, вам стоит посмотреть в сторону функций IP Helper, а конкретно вас интересует GetIpNetTable.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.08.2010, 10:15   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Есть такой вариант:
Код:
function GetLocalIPs: TStringList;
type
  TaPInAddr = Array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer: Array[0..63] of Char;
  I: Integer;
  GInitData: TWSAData;
  IPs: TStringList;
begin
  IPs := TStringList.Create;
  WSAStartup($101, GInitData);
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(buffer);
  if phe = nil then IPs.Add('No IP found')
  else
  begin
    pPtr := PaPInAddr(phe^.h_addr_list);
    I := 0;
    while pPtr^[I] <> nil do
    begin
      IPs.Add(inet_ntoa(pptr^[I]^));
      Inc(I);
    end;
  end;
  WSACleanup;
  Result := IPs;
end;
Определяет все IP. Уберите из списка внешний и вуаля.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 03.04.2012, 21:50   #8
vanderson
Новичок
Джуниор
 
Регистрация: 02.03.2010
Сообщений: 2
Радость Определение Ip адреса

Большое спасибо! Отпала необходимость в Indy и LMD. Сэкономил кучу времени. Буду рад чем нибудь помочь.
vanderson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Смена IP локального подключения Denager Работа с сетью в Delphi 6 28.08.2012 16:29
После подключения внутреннего кардридера перестали определяться дополнительные USB- порты vasek123 Компьютерное железо 1 10.08.2009 22:28
параметры локального подключения KArl Работа с сетью в Delphi 4 18.10.2008 12:34
Вызов формы внутреннего (dll) ActiveX сервера HelloEverybody Компоненты Delphi 2 29.01.2008 17:25