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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2007, 23:02   #1
APOSTOL
 
Регистрация: 05.06.2007
Сообщений: 3
По умолчанию Реализовать такую тему как в винде ( arp -a ), получить ARP таблицу

Вопрос как в дельфи можно реализовать такую тему как в винде ( arp -a ), получить ARP таблицу .
APOSTOL вне форума Ответить с цитированием
Старый 05.06.2007, 23:17   #2
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

Текущую через GetIpNetTable
Учитывай, что она динамически перестраивается каждые 30 сек, за исключением статических адресов

Пример: http://rouse.drkb.ru/network.php#infofromip
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Старый 06.06.2007, 19:43   #3
APOSTOL
 
Регистрация: 05.06.2007
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Rouse_ Посмотреть сообщение
Текущую через GetIpNetTable
Учитывай, что она динамически перестраивается каждые 30 сек, за исключением статических адресов

Пример: http://rouse.drkb.ru/network.php#infofromip
а можно по подробней. Я там пример не нашол
APOSTOL вне форума Ответить с цитированием
Старый 07.06.2007, 12:15   #4
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

Поподробней? Хм...

Код:
 
////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : ARPTable
//  * Purpose   : Демо выполнения команды ARP -A
//  * Author    : Александр (Rouse_) Багель
//  * Copyright : © Fangorn Wizards Lab 1998 - 2007
//  * Version   : 1.00
//  * Home Page : http://rouse.drkb.ru
//  ****************************************************************************
//
program ARPTable;
{$APPTYPE CONSOLE}
uses
  Windows,
  SysUtils,
  CommCtrl;
const
  IPHLPAPI = 'IPHLPAPI.DLL';
  MAX_ADAPTER_ADDRESS_LENGTH = 8;
type
  TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of Byte;
  PMibIPNetRow = ^TMibIPNetRow;
  TMibIPNetRow = packed record
    dwIndex         : DWORD;
    dwPhysAddrLen   : DWORD;
    bPhysAddr       : TMACAddress;
    dwAddr          : DWORD;
    dwType          : DWORD;
  end;
  PMibIPNetTable = ^TMibIPNetTable;
  TMibIPNetTable = packed record
    dwNumEntries    : DWORD;
    Table: PMibIPNetRow;
  end;
  function GetIpNetTable(pIpNetTable: PMibIPNetTable;
    pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall; external IPHLPAPI;
  function GetMAC(const Value: TMacAddress; const Length: DWORD): String;
  var
    I: Integer;
  begin
    // IP адрес представляет из себя 8 байт (2 байта зарезервированно)
    // Извлекаем каждый байт и преобразуем его в строку
    if Length = 0 then Result := '00-00-00-00-00-00' else
    begin
      Result := '';
      for i:= 0 to Length -2 do
        Result := Result + IntToHex(Value[i], 2) + '-';
      Result := Result + IntToHex(Value[Length-1], 2);
    end;
  end;
  function GetDottedIPFromInAddr(const InAddr: Integer): String;
  begin
    // IP адрес представляет из себя 4 байта расположенных в обратном порядке
    // Извлекаем каждый байт и преобразуем его в строку
    Result := '';
    Result := IntToStr(FOURTH_IPADDRESS(InAddr));
    Result := Result + '.' + IntToStr(THIRD_IPADDRESS(InAddr));
    Result := Result + '.' + IntToStr(SECOND_IPADDRESS(InAddr));
    Result := Result + '.' + IntToStr(FIRST_IPADDRESS(InAddr));
  end;
  function GetType(const dwType: DWORD): String;
  begin
    // Константы типов записи описаны в MSDN
    case dwType of
      1: Result := 'Other';
      2: Result := 'Invalid';
      3: Result := 'Dynamic';
      4: Result := 'Static';
    end;
  end;
var
  MibIPNetTable: PMibIPNetTable;
  MibIPNetRow: PMibIPNetRow;
  pdwSize: ULONG;
  I: Integer;
  InternetAddress, PhysicalAddress, AType: String;
begin
  // Первоначально узнаем необходимый размер под буффер для функции
  // Для этого первым параметром передаем NIL, во второй параметр
  // вернется результат в случае если код ошибки будет ERROR_INSUFFICIENT_BUFFER
  if GetIpNetTable(nil, @pdwSize, False) = ERROR_INSUFFICIENT_BUFFER then
  begin
    // Выделяем необходимый буффер
    GetMem(MibIPNetTable, pdwSize);
    try
      // Выполняем функцию уже с буффером - результат должен быть NO_ERROR
      if GetIpNetTable(MibIPNetTable, @pdwSize, False) = NO_ERROR then
      begin
        // Получаем адрес начала массива записей TMibIPNetRow
        // (4 байта от начала самой структуры)
        MibIPNetRow := Pointer(DWORD(MibIPNetTable) + SizeOf(DWORD));
        Writeln('  Internet Address      Physical Address      Type');
        // Крутим цикл по всем записям, кол-во записей в dwNumEntries
        for I := 0 to MibIPNetTable^.dwNumEntries - 1 do
        begin
          // Получаем IP адрес
          InternetAddress := GetDottedIPFromInAddr(MibIPNetRow^.dwAddr);
          // Получаем МАС адрес
          PhysicalAddress :=
            GetMAC(MibIPNetRow^.bPhysAddr, MibIPNetRow^.dwPhysAddrLen);
          // Получаем тип записи
          AType := GetType(MibIPNetRow^.dwType);
          // Выводим на экран
          Writeln(Format('  %-16s      %17s     %s',
            [InternetAddress, PhysicalAddress, AType]));
          // Переходим к следующей записи
          Inc(MibIPNetRow);
        end;
      end;
    finally
      // Освобождаем занятый буффер
      FreeMem(MibIPNetTable);
    end;
  end;
  Readln;
end.
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите решить такую задачу: Haret Паскаль, Turbo Pascal, PascalABC.NET 12 20.12.2015 11:36
Нужно реализовать на php такую штуку samiro PHP 2 08.02.2008 22:51
Кто сможет написать такую весЧъ??? За много WMZ!!! :) Terron Фриланс 4 17.01.2008 17:14
проблема с печатью текста в винде Gorthaur Win Api 0 19.11.2007 18:46