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

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

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

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

Сообщение trexxet » 14.06.2013 00:13:52

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

Добавлено спустя 13 часов 1 минуту 30 секунд:
Ну, товарищи, чего игнорируете? :(
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

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

Сообщение Лекс Айрин » 14.06.2013 14:25:46

trexxet, тех кто знает нет, вот и игнорируют. Подожди до вечера, хотя бы...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Xenar » 14.06.2013 16:13:03

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

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

Сообщение midisa » 14.06.2013 16:18:06

Здесь парни эту тему обсуждают: http://free-pascal-general.1045716.n5.n ... 12655.html
я в паскале пока новичек, не могу прокоментировать на сколько эффективны предложенные варианты.
midisa
новенький
 
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk

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

Сообщение Xenar » 14.06.2013 16:23:24

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

хотя был не внимателен. В начале вполне себе вей с помощью libc. Но это, насколько я понял, только под lin
Аватара пользователя
Xenar
постоялец
 
Сообщения: 158
Зарегистрирован: 08.06.2011 12:54:07

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

Сообщение midisa » 14.06.2013 16:57:33

Вот пример на сях : 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.
midisa
новенький
 
Сообщения: 95
Зарегистрирован: 13.06.2013 18:27:53
Откуда: Omsk

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

Сообщение Little_Roo » 14.06.2013 17:35:23

Курим теги [code][/code] :shock:
В противном случае список читающих Ваши посты уменьшаются на порядки :(
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

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

Сообщение debi12345 » 14.06.2013 17:59:00

Уже обсуждалось в 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}'
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение trexxet » 15.06.2013 14:56:35

Спасибо, забыл указать, что для винды. Для линя спасибо, но на нем не работает сетевая библиотека, которую я использую.
Уже не по теме, но как парсить вывод 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?
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

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

Сообщение Kemet » 15.06.2013 16:10:14

Можно взять модули из Network traffic monitor
или NetwrokTrafficMeter
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

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

Сообщение debi12345 » 15.06.2013 17:42:47

Решение на "GetIPAddressOfInterface( if_name:ansistring):ansistring;" страдает тем,что сперва нужно получить список инетерфейсов - чтобы потом для каждого вызывать эту функцию.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение trexxet » 16.06.2013 23:17:01

Решение на "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 вообще неверные показания дает, точней он ничего не выдает.
Других идей нет? :(
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

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

Сообщение Vadim » 17.06.2013 03:45:35

Если речь идёт только о 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;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение Kemet » 17.06.2013 09:29:38

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

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

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

Сообщение trexxet » 17.06.2013 17:49:54

Если речь идёт только о 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
Так, не?
trexxet
новенький
 
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 234

Рейтинг@Mail.ru