Как получить IP компьютера?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Как получить IP компьютера?

Сообщение trexxet »

Как получить IP компьютера в локальной сети/интернете средствами Lazarus? Желательно не привлекая виджеты, т.к. пишу обычную консолку. Если что, то использую эту http://zengl.org/forum/index.php/topic,242.0.html библиотеку (она нормально возвращает IP подключающегося клиента, но IP своего же сервера показывает как 0.0.0.0). Буду очень благодарен.

Добавлено спустя 13 часов 1 минуту 30 секунд:
Ну, товарищи, чего игнорируете? :(
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

trexxet, тех кто знает нет, вот и игнорируют. Подожди до вечера, хотя бы...
Аватара пользователя
Xenar
постоялец
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Сообщение Xenar »

Под линуху долго не заморачивался поисками, сделал через терминальный ifconfig через AsyncProcess и распарсил вывод.
midisa
новенький
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk
Контактная информация:

Сообщение midisa »

Здесь парни эту тему обсуждают: http://free-pascal-general.1045716.n5.n ... 12655.html
я в паскале пока новичек, не могу прокоментировать на сколько эффективны предложенные варианты.
Аватара пользователя
Xenar
постоялец
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

Сообщение Xenar »

Ну там тоже парсят :D
Под линухой парсят /proc/net/dev. И это конечно значительне кошернее чем мой способ.
Под виндой парсят вывод cmd

хотя был не внимателен. В начале вполне себе вей с помощью libc. Но это, насколько я понял, только под lin
midisa
новенький
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk
Контактная информация:

Сообщение midisa »

Вот пример на сях : ftp://ftp.midisa.net/rukobludstvo/getip
Там есть скомпилированный файл и файл проекта на нетбинсе. (буквально 10 строк).
Выдает:
[dima@home-dima GNU-Linux-x86]$ ./get_ip
lo IP Address 127.0.0.1
p2p1 IP Address 192.168.1.12
lo IP Address ::1
p2p1 IP Address fe80::52e5:49ff:fe3d:782c
[dima@home-dima GNU-Linux-x86]$
Прости дружище паскаль пока не выучил (в процессе, но идет так туго, постоянная зевота и сонливость :-) ).

Добавлено спустя 12 минут 10 секунд:
если не ошибаюсь то именно то что вам нужно (хотя могу ошибится):

Код: Выделить всё

program ip_addr;
{$MODE OBJFPC}

uses libc;

function GetIPAddressOfInterface( if_name:ansistring):ansistring;
var
  ifr : ifreq;
  sock : longint;
  p:pChar;

begin
  Result:='0.0.0.0';
  strncpy( ifr.ifr_ifrn.ifrn_name, pChar(if_name), IF_NAMESIZE-1 );
  ifr.ifr_ifru.ifru_addr.sa_family := AF_INET;
  sock := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
  if ( sock >= 0 ) then begin
    if ( ioctl( sock, SIOCGIFADDR, @ifr ) >= 0 ) then begin
      p:=inet_ntoa( ifr.ifr_ifru.ifru_addr.sin_addr );
      if ( p <> nil ) then Result :=  p;
    end;
    libc.__close(sock);
  end;
end;



var
  i:LongInt;
begin
  if (ParamCount>0)
  then for i:=1 to ParamCount
       do WriteLn(GetIPAddressOfInterface(ParamStr(i)))
  else WriteLn('Usage:', ParamStr(0), '<interface-name>')
end.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

Курим теги [code][/code] :shock:
В противном случае список читающих Ваши посты уменьшаются на порядки :(
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Уже обсуждалось в http://freepascal.ru/forum/viewtopic.php?f=5&t=9082&p=719344 даже на случай нескольких сетевых интерфейсов (требуется пайп-парсинг вывода следующих команд):

Вынь-32:

Код: Выделить всё

C:\Program Files\Far Manager>route print
===========================================================================
Список интерфейсов
0x1 ........................... MS TCP Loopback interface
0x2 ...00 11 d8 40 4d 44 ...... Realtek RTL8139/810x Family Fast Ethernet NIC #2 -
Активные маршруты:
Сетевой адрес           Маска сети      Адрес шлюза       Интерфейс  Метрика
          0.0.0.0          0.0.0.0    192.168.1.229   192.168.1.239       20
   74.125.143.102  255.255.255.255    192.168.1.229   192.168.1.239       20
   87.250.251.119  255.255.255.255    192.168.1.229   192.168.1.239       20
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
      192.168.1.0    255.255.255.0    192.168.1.239   192.168.1.239       20
    192.168.1.239  255.255.255.255        127.0.0.1       127.0.0.1       20
    192.168.1.255  255.255.255.255    192.168.1.239   192.168.1.239       20
        224.0.0.0        240.0.0.0    192.168.1.239   192.168.1.239       20
  255.255.255.255  255.255.255.255    192.168.1.239   192.168.1.239       1
Основной шлюз:       192.168.1.229

Выбираем поле "Интерфейс" в строках, в которых "Сетевой адрес" и "Маска сети" равны 255.255.255.255, а "Адрес шлюза" и "Интерфейс" равны между собой (автомаршрут интерфейса).

Линь:

Код: Выделить всё

ifconfig | grep "inet addr:" | awk '{print $2}' | awk -F ":" '{print $2}'
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Спасибо, забыл указать, что для винды. Для линя спасибо, но на нем не работает сетевая библиотека, которую я использую.
Уже не по теме, но как парсить вывод cmd? Я до этого даже не пытался этим заниматься.
Насколько я понял, то тут

Код: Выделить всё

route print
===========================================================================
Список интерфейсов
 11...f4 6d 04 73 91 9d ......Realtek PCIe GBE Family Controller
  1...........................Software Loopback Interface 1
 22...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP
 12...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
===========================================================================

IPv4 таблица маршрута
===========================================================================
Активные маршруты:
Сетевой адрес           Маска сети      Адрес шлюза       Интерфейс  Метрика
          0.0.0.0          0.0.0.0      192.168.1.1    192.168.1.162     20
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      192.168.1.0    255.255.255.0         On-link     192.168.1.162    276
    192.168.1.162  255.255.255.255         On-link     192.168.1.162    276
    192.168.1.255  255.255.255.255         On-link     192.168.1.162    276
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link     192.168.1.162    276
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link     192.168.1.162    276
===========================================================================
Постоянные маршруты:
  Сетевой адрес            Маска    Адрес шлюза      Метрика
          0.0.0.0          0.0.0.0          5.0.0.1  По умолчанию
===========================================================================

IPv6 таблица маршрута
===========================================================================
Активные маршруты:
 Метрика   Сетевой адрес            Шлюз
  1    306 ::1/128                  On-link
 11    276 fe80::/64                On-link
 11    276 fe80::c50b:cdf1:fa2e:c5e1/128
                                    On-link
  1    306 ff00::/8                 On-link
 11    276 ff00::/8                 On-link
===========================================================================
Постоянные маршруты:
 Метрика   Сетевой адрес            Шлюз
  0 4294967295 2620:9b::/96             On-link
===========================================================================

IP компьютера в локалке 192.168.1.162, что совпадает с показаниями панели управления, но мне-то надо это в программу вывести. Как узнать IP машины в интернете, не прибегая к использованию сервисов вроде 2ip.ru?
Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Сообщение Kemet »

Можно взять модули из Network traffic monitor
или NetwrokTrafficMeter
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Решение на "GetIPAddressOfInterface( if_name:ansistring):ansistring;" страдает тем,что сперва нужно получить список инетерфейсов - чтобы потом для каждого вызывать эту функцию.
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Решение на "GetIPAddressOfInterface( if_name:ansistring):ansistring;" страдает тем,что сперва нужно получить список инетерфейсов - чтобы потом для каждого вызывать эту функцию.

А еще он не компилируется, хотя при тыке с зажатым Ctrl лазарь верно показывает юнит

Код: Выделить всё

project1.lpr(0,0) Fatal: Can not find unit libc used by ip_addr.

Можно взять модули из Network traffic monitor или NetwrokTrafficMeter

Там сплошной непрокомменитрованный код, а Traffic Monitor вообще неверные показания дает, точней он ничего не выдает.
Других идей нет? :(
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Если речь идёт только о Windows, то можно сделать что-то вроде этого:

Код: Выделить всё

Function GetLocalIP : 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;
Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Сообщение Kemet »

trexxet писал(а):
Можно взять модули из Network traffic monitor или NetwrokTrafficMeter

Там сплошной непрокомменитрованный код, а Traffic Monitor вообще неверные показания дает, точней он ничего не выдает.
Других идей нет? :(
Ну извини, других бананьев у меня для тебя нема.
А чего там комментировать? MSDN перетягивать в комменты? Открываешь этот мсдн и читаешь про апишные функции, которые в IPHLPAPI.pas/IPHelper.pas используются. Я для/за тебя даже страничку нашел за 15 секунд
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Если речь идёт только о Windows, то можно сделать что-то вроде этого:

Спасибо, заработало, только еще нужно подключать WinSock. Не совсем понятен принцип работы, но работает.
Открываешь этот мсдн и читаешь про апишные функции, которые в IPHLPAPI.pas/IPHelper.pas используются.

Я даже не понимаю то, что там написано, с сетью в первый раз работаю. Буду учиться :)

Добавлено спустя 52 минуты 10 секунд:
Немного разобрался с функцией.
WSAStartup($0101, WSAData); - инициализация Winsock
GetHostName(Name, $FF); - получение какого-то имени компьютера
P := GetHostByName(Name); - создается указатель на компьютер по его имени
Result := inet_ntoa(PInAddr(P.h_addr_list^)^); - перевод функцией inet_ntoa каким-то образом полученного IP в строку и возврат значения.
WSACleanup; - завершение Winsock
Так, не?
Ответить