Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > получение всех ip удаленного компьютера


Автор: mntek 21.9.2005, 09:30
есть сеть с 2мя типами адресов - внутренние (ip вида 10.0.*.*) и внешние (ip вида 192.168.*.* и 195.19.*.*). необходимо установить соответствие между внешними и внутренними адресами, используя только внешний ip для определения внутреннего.

Автор: Snowy 21.9.2005, 09:52
Изнутри можно использовать traceroute.
Снаружи никак, если только не поставить внутри специальный сервер, который будет сообщать эту инфу.

Автор: mntek 21.9.2005, 09:54
самое интересное, что такое возможно.. но вот как?_(
есть человек, который подобное сделал, но не хочет общаться на данную тему.

Автор: z-END 21.9.2005, 10:32
Цитата(mntek @ 21.9.2005, 10:30)
- внутренние (ip вида 10.0.*.*) и внешние (ip вида 192.168.*.* и 195.19.*.*).

я плохо разбираюсь в струкре IP адресов, но мне почему-то кажется что:
10.* - внешний
195.* - внешний
192.* - внутренний
или я неправ?

Автор: Snowy 21.9.2005, 10:39
Цитата(mntek @ 21.9.2005, 09:54)
самое интересное, что такое возможно..

Вероятно, если вручную формировать IP пакеты трэйсроута.
P.S. Интересная сеть, если все машины имеют внутренние и внешние IP.
Напрашивается вопрос "Зачем?"

Автор: mntek 21.9.2005, 10:45
Цитата(z @ 21.9.2005, 10:32)
я плохо разбираюсь в струкре IP адресов, но мне почему-то кажется что:
10.* - внешний
195.* - внешний
192.* - внутренний
или я неправ?


конкретно для нашей сети - нет.
и 10.0.* и 192.168.* по идее выделены под внутренние, но у нас немного другое разделение
Добавлено @ 10:47
Цитата(Snowy @ 21.9.2005, 10:39)
Вероятно, если вручную формировать IP пакеты трэйсроута.
P.S. Интересная сеть, если все машины имеют внутренние и внешние IP.
Напрашивается вопрос "Зачем?"


внешние адреса имеют не все машины... вот в этом-то и все дело_(
хм...для поиска ресурсов, общения, etc...

Автор: Snowy 21.9.2005, 17:25
По-моему я сегодня немного притормаживаю.
Если я ничего не путаю, то gethostbyname и gethostbyaddr должны возвращать список всех айпишников запрашиваемой машины.
Или это только при совпадении имен... Так byaddr не может совпасть...
У меня под рукой нет машины с двумя IP. Попробуй сам проверить.

Автор: mntek 23.9.2005, 00:37
нет... не возвращает..(
по-видимому надо просматривать все интерфейсы _удаленной_ машины, чтобы определить и все ее ip. а вот как это сделать?

Автор: Snowy 23.9.2005, 09:53
Цитата(mntek @ 23.9.2005, 00:37)
по-видимому надо просматривать все интерфейсы _удаленной_ машины, чтобы определить и все ее ip. а вот как это сделать?

А никак. С чего это она будет тебе рассказывать про свои интерфейсы.
Могу предложить вариант: просканить имена всех машин в одной подсети, во второй, третей. А потом провести соответствие.
Может и существуют какие-то другие недокументированные хакерские средства, но мне они неизвестны.

Автор: mntek 23.9.2005, 10:00
Цитата(Snowy @ 23.9.2005, 09:53)
Могу предложить вариант: просканить имена всех машин в одной подсети, во второй, третей. А потом провести соответствие.


имена тоже различаются. внешняя подсеть имеет свой днс. можно еще по маку сравнивать тогда, но его тоже не всегда получить можно, особенно на *никсовых машинах_(

Автор: Snowy 23.9.2005, 10:09
Цитата(mntek @ 23.9.2005, 10:00)
имена тоже различаются. внешняя подсеть имеет свой днс.

Различаются полностью или только суффиксом?

Цитата(mntek @ 23.9.2005, 10:00)
можно еще по маку сравнивать

Нельзя. На разных адаптерах он разный, так же как и IP.

Автор: mntek 23.9.2005, 10:32
Цитата(Snowy @ 23.9.2005, 10:09)
Различаются полностью или только суффиксом?

полностью.

Автор: mntek 24.9.2005, 13:13
Цитата(Snowy @ 23.9.2005, 10:09)
Нельзя. На разных адаптерах он разный, так же как и IP.

вот я что подумал, а мак-то один. адаптер-то один. просто на нем прописано 2 разных ip.

Автор: mntek 14.10.2005, 01:45
хм... разобрался_)
используем функцию NetWkstaGetInfo из NetApi32.dll:

Код

function GetDomainName(sname: PWideChar): AnsiString;
type
  WKSTA_INFO_100 = record
    wki100_platform_id: Integer;
    wki100_computername: PWideChar;
    wki100_langroup: PWideChar;
    wki100_ver_major: Integer;
    wki100_ver_minor: Integer;
  end;

type
  TWinNT_NetWkstaGetInfo = function(ServerName: PWideChar; level: Integer; var
    BufPtr: Pointer): Integer; stdcall;
  TWinNT_NetApiBufferFree = function(BufPtr: Pointer): Integer; stdcall;

var
  WinNT_NetWkstaGetInfo: TWinNT_NetWkstaGetInfo;
  WinNT_NetApiBufferFree: TWinNT_NetApiBufferFree;
  WSNT: ^WKSTA_INFO_100;
  EC: DWORD;
  hNETAPI: THandle;
begin
  try
    Result := '';
    hNETAPI := LoadLibrary('NETAPI32.DLL');
    if hNETAPI <> 0 then
      begin
        @WinNT_NetWkstaGetInfo := GetProcAddress(hNETAPI, 'NetWkstaGetInfo');
        @WinNT_NetApiBufferFree := GetProcAddress(hNETAPI, 'NetApiBufferFree');
        EC := WinNT_NetWkstaGetInfo(sname, 100, Pointer(WSNT));
        if EC = 0 then
          begin
            Result := WideCharToString(WSNT^.wki100_computername);
            WinNT_NetApiBufferFree(Pointer(WSNT));
          end;
      end;
  finally
    if hNETAPI <> 0 then
      FreeLibrary(hNETAPI);
  end;
end;

вызывать например так:
Код

  Memo1.Lines.Add(GetDomainName(StringToOleStr(Edit1.Text)));


зы - код работает только под nt-based системы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)