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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2009, 08:49   #1
Proger10
Пользователь
 
Регистрация: 07.03.2009
Сообщений: 19
По умолчанию Как узнать все IP-адреса компьютера.

О том как узнать ip компьютера можно прочитать тут. А если компьютер имеет две сетевые карты (ну например беспроводную и проводную), то у компьютера будет два ip адреса. Мне нужно вывести в листбокс все ip-адреса. Как это сделать??
Proger10 вне форума Ответить с цитированием
Старый 14.05.2009, 09:29   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Вкладка Indy/Misc
Компонент IdIPAddrMon
после его активизации (active:=true), все IP адреса будут храниться в свойстве IPAddresses
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 14.05.2009, 10:04   #3
Proger10
Пользователь
 
Регистрация: 07.03.2009
Сообщений: 19
По умолчанию

А можно как-то по-другому получить ip-адреса (без каких-либо компонентов)?
Proger10 вне форума Ответить с цитированием
Старый 14.05.2009, 10:21   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Несложными манипуляциями выясняете исходный код, используемый в Indy для этого

Код:
procedure TIdStackWindows.AddLocalAddressesToList(AAddresses: TStrings);
{$IFNDEF WINCE}
type
  TaPInAddr = array[0..250] of PInAddr;
  PaPInAddr = ^TaPInAddr;
{$ENDIF}
var
  {$IFNDEF WINCE}
  i: integer;
  AHost: PHostEnt;
  PAdrPtr: PaPInAddr;
  {$ENDIF}
  {$IFDEF UNICODE}
  Hints: TAddrInfoW;
  LAddrInfo: pAddrInfoW;
  {$ELSE}
  Hints: TAddrInfo;
  LAddrInfo: pAddrInfo;
  {$ENDIF}
  RetVal: Integer;
  LHostName: String;
  {$IFDEF UNICODESTRING}
  LTemp: AnsiString;
  {$ELSE}
    {$IFDEF UNICODE_BUT_NO_UNICODESTRING}
  LTemp: WideString;
    {$ENDIF}
  {$ENDIF}
begin
  LHostName := HostName;
  {$IFNDEF WINCE}
  if not GIdIPv6FuncsAvailable then
  begin
    {$IFDEF UNICODESTRING}
    LTemp := AnsiString(LHostName); // convert to Ansi
    AHost := gethostbyname(PAnsiChar(LTemp));
    {$ELSE}
    AHost := gethostbyname(PAnsiChar(LHostName));
    {$ENDIF}
    if AHost = nil then begin
      RaiseLastSocketError;
    end;
    PAdrPtr := PAPInAddr(AHost^.h_address_list);
    i := 0;
    if PAdrPtr^[i] <> nil then begin
      AAddresses.BeginUpdate;
      try
        repeat
          AAddresses.Add(TranslateTInAddrToString(PAdrPtr^[I]^, Id_IPv4)); //BGO FIX
          Inc(I);
        until PAdrPtr^[i] = nil;
      finally
        AAddresses.EndUpdate;
      end;
    end;
    Exit;
  end;
  {$ENDIF}
  ZeroMemory(@Hints, SIZE_TADDRINFO);
  Hints.ai_family := Id_PF_INET4;
  Hints.ai_socktype := SOCK_STREAM;
  LAddrInfo := nil;

  {$IFDEF UNICODE_BUT_NO_UNICODESTRING}
  LTemp := LHostName; // convert to Unicode
  RetVal := getaddrinfo(PWideChar(LTemp),
  {$ELSE}
  RetVal := getaddrinfo(PChar(LHostName),
  {$ENDIF}
    nil, @Hints, @LAddrInfo);

  try
    if RetVal <> 0 then begin
      RaiseSocketError(gaiErrorToWsaError(RetVal));
    end;
    if LAddrInfo <> nil then
    begin
      AAddresses.BeginUpdate;
      try
        repeat
	  AAddresses.Add(TranslateTInAddrToString(LAddrInfo^.ai_addr^.sin_addr, Id_IPv4));
          LAddrInfo := LAddrInfo^.ai_next;
        until LAddrInfo = nil;
      finally;
        AAddresses.EndUpdate;
      end;
    end;
  finally
    freeaddrinfo(LAddrInfo);
  end;
end;
почистить её от ненужного не должно составить труда.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 14.05.2009, 10:44   #5
Proger10
Пользователь
 
Регистрация: 07.03.2009
Сообщений: 19
По умолчанию

ЭЭээ.... Кому-ту отчистить от ненужного не составит труда, но мне это давольно сложно! Помогите, пожалуйста.
Proger10 вне форума Ответить с цитированием
Старый 14.05.2009, 11:13   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Если сложно, тогда используйте готовое решние из первого поста.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 18.02.2012, 15:05   #7
NoNameMan
Пользователь
 
Регистрация: 23.11.2010
Сообщений: 21
По умолчанию

Сори что пишу в старую тему но я подумал что лучше написать сюда чем создавать новую тему))
Цитата:
Сообщение от Квэнди Посмотреть сообщение
Вкладка Indy/Misc
Компонент IdIPAddrMon
после его активизации (active:=true), все IP адреса будут храниться в свойстве IPAddresses
А где взять этот компонент если его нет в Indy/Misc или какие еще есть решения данной задачи?
P.S. У меня Delphi 7 Lite Edition и я проверял на Delphi 7 с оригинального диска но там тоже нет((
NoNameMan вне форума Ответить с цитированием
Старый 18.02.2012, 23:59   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Код:
uses Winsock;



function GetLocalPs: 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;

procedure TForm1.RzBitBtn10Click(Sender: TObject);
var sl: TStringList;
begin
  sl := TStringList.Create;
  sl := GetLocalPs;
  ShowMessage(sl.Text);
  sl.Free;
end;
Вытащит все адреса, включая локальную сеть.
IdIPAddrMon в семерке нет. Нужна версия помоложе.
_SERGEYX_ вне форума Ответить с цитированием
Старый 19.02.2012, 00:14   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
IdIPAddrMon в семерке нет. Нужна версия помоложе.
а обновить инди не вариант?
все равно это стоит делать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать из адреса файл это или папка? Anfall Общие вопросы Delphi 12 25.02.2009 23:40
Узнать все данные о видеокарте alex724842 Общие вопросы Delphi 5 07.02.2009 21:29
нужен совет по определению адреса компьютера max0129 Помощь студентам 2 22.11.2008 16:27
узнать с какого компьютера заходили на определенный сайт? Lidi Помощь студентам 3 20.08.2008 15:56
узнать IP компьютера, на котором находится серверная часть DartMrakkk Работа с сетью в Delphi 5 02.01.2008 16:55