Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/263: Рейтинг темы: голосов - 263, средняя оценка - 4.73
(Yellow_Duck)
1261 / 130 / 15
Регистрация: 16.10.2008
Сообщений: 733
1

Как узнать IP адрес своего компьютера.

27.12.2008, 14:14. Показов 49622. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, мне надо, что бы программа, исскала ИП адрес компьютера на котором она стоит, причем мне надо чтобы это бы не тот ип, который пишется в состоянии подключения, а тот который к примеру можно посмотреть тут:
http://www.myip.ru/
Может можно сделать, чтобы программа заходила сюда как-то сама, и считывала инфу?
спасибо

Добавлено через 14 часов 24 минуты 16 секунд
НУ помогите, плиз ))))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2008, 14:14
Ответы с готовыми решениями:

Как узнать входящий порт своего компьютера?
У меня дома кабель провайдера заходит в роутер,через лан подключен мой комп и через другой лан IP...

Как программно узнать характеристики своего компьютера?
Как программно узнать характеристики своего компьютера? процессор , озу , разрядность , винду ,...

Как программно узнать характеристики своего компьютера?
Как программно узнать характеристики своего компьютера? процессор , озу , разрядность , винду ,...

Как узнать имя компьютера (своего, чужого) из кода на VB?
Как узнать имя компьтера(своего,чужого) из кода на VB ??? Спасиба

18
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
27.12.2008, 15:41 2
Скачай страницу с этого сайта... мы видим, что он представляет из себя:
HTML5
1
2
3
4
5
6
<BODY bgcolor=white>
<TABLE width=100% height=100% cellspacing=0 cellpadding=0 border=0><TD align=center valign=middle>
<TABLE width=500 height=100 cellspacing=0 cellpadding=0 border=0>
<TR><TD bgcolor=#43AA2E><TABLE width=500 height=100 cellspacing=1 cellpadding=4 border=0>
  <TR><TD bgcolor=#E0EED3 height=30 align=center valign=middle><B>Ваш IP-адрес</B></TD></TR>
  <TR><TD bgcolor=white align=center valign=middle>91.78.229.139</TD></TR>
Значит, надо пропустить 3 тега <TABLE, потом 2 тега <TD... после этого пропустить закрытие тега, и отсюда начинается сам IP до открытия нового тега. Если код страницы содержится в переменной S
Delphi
1
2
3
4
5
6
7
8
9
10
11
Uses StrUtils; // Что бы использовать PosEx
Var P : Integer;
Begin
  P := Pos('<TABLE',S);  // Нашли первую таблицу
  P := PosEx('<TABLE',S,P+1); // Вторую таблицу
  P := PosEx('<TABLE',S,P+1); // Третью таблицу
  P := PosEx('<TD',S,P+1); // Первый TD
  P := PosEx('<TD',S,P+1); // Второй TD
  P := PosEx('>',S,P+1); // TD закрылся
  Delete(S,1,P);  // Удаляем всё до IP адреса
  S := Copy(S,1,Pos('<',S)-1);  // Копируем IP адрес до начала следующего тега
Теперь S содержит IP адрес. Как будешь скачивать не знаю... лично я использую самодельный компонент... но говорят, что есть стандартный TBrowser
0
(Yellow_Duck)
1261 / 130 / 15
Регистрация: 16.10.2008
Сообщений: 733
06.01.2009, 17:42  [ТС] 3
Да так понятно, я сделал, тока еще одна проблемка, когда делаешь навигацию браузера, то форма становится видима((
Не знаете, как избавиться?
0
701 / 573 / 59
Регистрация: 18.11.2008
Сообщений: 2,147
06.01.2009, 18:42 4
а нафига вообще браузер какой-то нужен? не проше ли просто страницу качнуть?
да, и не проще ли этот ip регуляркой найти?:
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
или так:
((?:\d{1,3}\.){3}\d{1,3})
0
12 / 12 / 2
Регистрация: 03.10.2008
Сообщений: 436
27.02.2009, 23:29 5
А мне наоборот нужен локальный IP который прописан в подключении
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
28.02.2009, 11:24 6
Цитата Сообщение от Ranger
А мне наоборот нужен локальный IP который прописан в подключении
Я делал так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
Function TForm1.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;
0
8 / 8 / 1
Регистрация: 26.02.2009
Сообщений: 65
28.02.2009, 20:39 7
Предлагаю такой вариант решения проблемы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function GetLocalHostAddress: string;
var
  SockAddrIn: TSockAddrIn;
  HostEnt: PHostEnt;
  szHostName: array[0..128] of char;
begin
  if gethostname(szHostName, 128) = 0 then
    begin
      HostEnt:= gethostbyname(szHostName);
      if HostEnt = nil then
        Result:= ''
      else
        begin
          SockAddrIn.sin_addr.S_addr:= longint(plongint(HostEnt^.h_addr_list^)^);
          Result:= inet_ntoa(SockAddrIn.sin_addr);
        end;
    end
  else
    { Error handle } ;
end;
1
8 / 8 / 1
Регистрация: 26.02.2009
Сообщений: 65
28.02.2009, 20:44 8
Предлагаю такой вариант
Вложения
Тип файла: txt localIP.txt (509 байт, 1907 просмотров)
0
3 / 3 / 0
Регистрация: 10.07.2009
Сообщений: 42
14.07.2009, 05:48 9
Есть есть еще нубее вары - кидай компонент TIdIPWatch из вкладки "Indy Misc", затем кинь компонент который будет отображать IP(к примеру кнопка "Button"). теперь пишешешь такой текст:
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Caption:=IdIPWatch1.LocalIP;
end;
Ой извеняюсь, давно это было...Только щас заметил.
1
2 / 2 / 0
Регистрация: 09.09.2009
Сообщений: 12
20.09.2009, 11:15 10
А можно узнать IP не заходя ни на какие сайты? Мне нужно определить ip, полученный в результате pppoe соединения.
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
20.09.2009, 13:16 11
Romany4, я для этих целей когда-то давно нашёл такую функцию:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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;
Там просто получаешь результат функции GetPPPIP
1
2 / 2 / 0
Регистрация: 09.09.2009
Сообщений: 12
20.09.2009, 13:34 12
Humanoid, спасибо большое! То что нужно!
0
4 / 4 / 1
Регистрация: 17.01.2009
Сообщений: 59
21.09.2009, 22:35 13
Так намного проще ;

http://www.whatismyip.com/automation/n09230945.asp
Код:

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
 
var 
    ip : string;
begin
    ip := idHTTP1.Get('http://www.whatismyip.com/automation/n09230945.asp');
    Form1.Edit1.Text:= ip;
end;
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
22.09.2009, 00:41 14
Yakov, предложенный Вами метод полностью полагается на сервис whatismyip. А что если этот сервис прекратит свое существование? Или как-то измениться доменное имя и/или путь к скрипту - все, он не работает.
Тем временем, как метод Humanoid, более независим и основан непосредственно на функционале ОС.
1
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
22.09.2009, 08:39 15
2polivets:
Метод Humanoid в посте #11 еще хуже, потому что он неправильный.
Конечно он даст тебе IP-ник на твоем PPP-интерфейсе.
Но в зависимости от способа подключения это может быть совсем не тот IP-ник, с которым ты выходишь в Internet.
Если используется подключение через NAT-сервер, то вообще говоря узнать внешний IP-ник NAT-сервера с которым твой компьютер выходит в глобальный Internet нельзя - потому что этот IP-ник нигде не записан внутри твоей ОС.
Остается только обходной путь - зайти на www.whatismyip.com и узнать IP.
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
22.09.2009, 09:13 16
odip, там я отвечал на вопрос про PPPoE соединение. Наверное, возможно, что бы PPPoE был ещё и совмещен с NATом... но лично я таких ситуаций никогда не встречал. Обычно, если используется PPP, то выдаётся внешний IP.
Использование whatismyip.com и т.п. мне не нравится по эстетическим причинам т.к. идёт обращение к серверу. Кроме того, я подозреваю что indy компонент будет занимать гораздо больше ресурсов, чем API функции... и если он больше в программе больше нигде не используется, то как-то не приятно его использовать для такой разовой цели
Но, конечно, в случае с NAT другого способа я не вижу, кроме как спросить свой IP у какого-нибудь сервера... но лично я считаю, что этим надо пользоваться только в крайнем случае.
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
22.09.2009, 09:53 17
VPN тоже делает PPP-соединение, как и PPPOE.
Я видел разные варианты - когда дают реальный IP, и когда дают внутренний IP.

На самом деле не понятно зачем вообще узнавать какой твой реальный IP за NAT.
0
4 / 4 / 1
Регистрация: 17.01.2009
Сообщений: 59
22.09.2009, 15:04 18
Как зачем ? Моей подруге или другу иногда нужна удаленная помощь , радмин или другая прога ждет меня , а что он скажет мне свой правильный IP не факт, поэтому проверяем IP и шлем на мыло pomochnik@delphi.ru А дальше дело техники
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
22.09.2009, 16:39 19
Если NAT делается у провайдера (то есть не на самом компе), то это ничего не даст.
Зайти на этот IP-ник все равно не получится.
0
22.09.2009, 16:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2009, 16:39
Помогаю со студенческими работами здесь

Как узнать IP-адрес компьютера в локальной сети
Как программно узнать IP? То есть на форме есть кнопка и текстбокс, как сделать чтобы при нажатии...

Как узнать ip-адрес роутера, который подключен ОТ компьютера?
Всех приветствую. Я сегодня сделал связку Компьютер-Роутер. Выключил DHCP-сервер на роутере, а...

Как узнать ІР адрес компьютера, с которого заходят на страницу вконтакте ?
Доброго времени суток. Прошу меня извинить что пост не по теме. Но просьба давать только толковые...

Как узнать внешний IP адрес компьютера если комп выходит ч.з. шлюз?
Добрый день! Подскажите как можно узнать внешний IP адрес своего компа, если комп находится в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru