Форум » [x]Harbour » Как получить список IP-шников на локальной машинке? » Ответить

Как получить список IP-шников на локальной машинке?

SADSTAR33: Наверное нужно использовать GetIpAddrTable http://msdn.microsoft.com/en-us/library/aa365949%28v=VS.85%29.aspx В составе библиотек ВСС55 есть ссылки на нее. А как применить к Харбору?

Ответов - 12

Pasha: Примерно так: #pragma BEGINDUMP #include "hbapi.h" #include "iphlpapi.h" HB_FUNC( GETIPADDRTABLE ) { PMIB_IPADDRTABLE pIpAddrTable; ULONG * pulSize; BOOL bOrder = hb_parl(1); GetIpAddrTable( pIpAddrTable, ( PULONG ) pulSize, bOrder ); hb_retclen( (char *) pIpAddrTable, *pulSize); } #pragma ENDDUMP и затем разбирать таблицу pIpAddrTable из строки. Ее структуру см. в iprtrmib.h Конечно, можно разбирать таблицу в этой функции и возвращать двумерный массив, но тогда код получится побольше. Функцию я набросал, но не проверял

SADSTAR33: Файл GetipTable.prg ---------------------------- #include <minigui.ch> function GetIPTable() local cResult:="" cResult:=GetIPaddrTable() return Nil //------------------------------------------------- #pragma BEGINDUMP #include "hbapi.h" #include "iphlpapi.h" HB_FUNC( GETIPADDRTABLE ) { PMIB_IPADDRTABLE pIpAddrTable; ULONG * pulSize; BOOL bOrder = hb_parl(1); GetIpAddrTable( pIpAddrTable, ( PULONG ) pulSize, bOrder ); hb_retclen( (char *) pIpAddrTable, *pulSize); } #pragma ENDDUMP ------------------------------- при компиляции выдает следующее ------------------------------- C:\MiniGUI54\Harbour\BIN\HARBOUR.EXE /iC:\MiniGUI54\Harbour\INCLUDE;C:\MiniGUI54\INCLUDE;D:\MiniGUI_Projects\proba_IPtable /n D:\MiniGUI_Projects\proba_IPtable\GetIPTable.Prg -oD:\MiniGUI_Projects\proba_IPtable\OBJ\GetIPTable.c C:\Borland\BCC55\BIN\BCC32.EXE -c -O2 -tW -M -IC:\Borland\BCC55\INCLUDE -IC:\MiniGUI54\Harbour\INCLUDE;C:\MiniGUI54\INCLUDE;D:\MiniGUI_Projects\proba_IPtable -LC:\Borland\BCC55\LIB -oD:\MiniGUI_Projects\proba_IPtable\OBJ\GetIPTable.obj D:\MiniGUI_Projects\proba_IPtable\OBJ\GetIPTable.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland D:\MiniGUI_Projects\proba_IPtable\OBJ\GetIPTable.c: Error E2258 C:\Borland\BCC55\INCLUDE\ras.h 54: Declaration was expected in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 63: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 64: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 65: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 83: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 84: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 85: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 167: Declaration missing ; in function DECLARE_HANDLE Error E2238 C:\Borland\BCC55\INCLUDE\ras.h 169: Multiple declaration for 'DWORD' in function DECLARE_HANDLE Error E2344 C:\Borland\BCC55\INCLUDE\ras.h 167: Earlier declaration of 'DWORD' in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 169: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 170: Declaration missing ; in function DECLARE_HANDLE Error E2238 C:\Borland\BCC55\INCLUDE\ras.h 171: Multiple declaration for 'WCHAR' in function DECLARE_HANDLE Error E2344 C:\Borland\BCC55\INCLUDE\ras.h 170: Earlier declaration of 'WCHAR' in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 171: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 180: Declaration missing ; in function DECLARE_HANDLE Error E2238 C:\Borland\BCC55\INCLUDE\ras.h 182: Multiple declaration for 'DWORD' in function DECLARE_HANDLE Error E2344 C:\Borland\BCC55\INCLUDE\ras.h 180: Earlier declaration of 'DWORD' in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 182: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 183: Declaration missing ; in function DECLARE_HANDLE Error E2238 C:\Borland\BCC55\INCLUDE\ras.h 184: Multiple declaration for 'CHAR' in function DECLARE_HANDLE Error E2344 C:\Borland\BCC55\INCLUDE\ras.h 183: Earlier declaration of 'CHAR' in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 184: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 205: Declaration missing ; in function DECLARE_HANDLE Error E2139 C:\Borland\BCC55\INCLUDE\ras.h 206: Declaration missing ; in function DECLARE_HANDLE Error E2228 C:\Borland\BCC55\INCLUDE\ras.h 206: Too many error or warning messages in function DECLARE_HANDLE *** 26 errors in Compile *** ** error 1 ** deleting D:\MiniGUI_Projects\proba_IPtable\OBJ\GetIPTable.obj

Pasha: надо добавить #include "windows.h"


SADSTAR33: Добавил ниже #pragma BEGINDUMP Скомпилил в МиниГУИ1.54 При вызове - ошибка Application Exception - Called from GETIPADDRTABLE(0) Called from GETIPTABLE(4) Called from START(20) Called from (b)MAIN(43) Called from _DOCONTROLEVENTPROCEDURE(1552) Called from EVENTS(1582) Called from _DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1273) Called from MAIN(15)

Pasha: Надо память выделять под 1 элемент таблицы для начального вызова: #pragma BEGINDUMP #include "hbapi.h" #include "windows.h" #include "iphlpapi.h" HB_FUNC( GETIPADDRTABLE ) { PMIB_IPADDRTABLE pIPAddrTable; ULONG ulSize = 0; BOOL bOrder = hb_parl(1); pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof( MIB_IPADDRTABLE) ); if (GetIpAddrTable(pIPAddrTable, &ulSize, bOrder) == ERROR_INSUFFICIENT_BUFFER) { GlobalFree( pIPAddrTable ); pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( ulSize ); } if ( GetIpAddrTable( pIPAddrTable, &ulSize, bOrder ) == NO_ERROR ) { hb_retclen( (char *) pIPAddrTable, ulSize); } else { hb_retc(""); } } #pragma ENDDUMP

SADSTAR33: вот что получилось - GetIPTable [pre] function GetIPTable(lSort) //возвращает массив локальных IP-адресов {{ip,mask}} в десятично-точечной нотации //отсортированый если lSort:=.t. local cResult:="", IPqty, ar:={}, s:="", n, i if lSort==Nil; lSort:=.f.; endif cResult:=GetIPaddrTable(lSort) IPqty:=GetDWord(cResult, 1) for i:=1 to IPqty n:=(i-1)*24+5 aAdd(ar,{GetIpAddr(cResult,n), GetIpAddr(cResult,n+8)}) next return ar //------------------------------------------------- static function GetDWord(cStr, nPos) local nResult nResult:=asc(substr(cStr,nPos+0,1))+asc(substr(cStr,nPos+1,1))*256+asc(substr(cStr,nPos+2,1))*256*256+asc(substr(cStr,nPos+3,1))*256*256*256 return nResult //------------------------------------------------- static function GetIpAddr(cStr, nPos) local cResult cResult:=alltrim(str(asc(substr(cStr,nPos+0,1)))); +"."+alltrim(str(asc(substr(cStr,nPos+1,1)))); +"."+alltrim(str(asc(substr(cStr,nPos+2,1)))); +"."+alltrim(str(asc(substr(cStr,nPos+3,1)))) return cResult //------------------------------------------------- #pragma BEGINDUMP #include "hbapi.h" #include "windows.h" #include "iphlpapi.h" HB_FUNC( GETIPADDRTABLE ) { PMIB_IPADDRTABLE pIPAddrTable; ULONG ulSize = 0; BOOL bOrder = hb_parl(1); pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof( MIB_IPADDRTABLE) ); if (GetIpAddrTable(pIPAddrTable, &ulSize, bOrder) == ERROR_INSUFFICIENT_BUFFER) { GlobalFree( pIPAddrTable ); pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( ulSize ); } if ( GetIpAddrTable( pIPAddrTable, &ulSize, bOrder ) == NO_ERROR ) { hb_retclen( (char *) pIPAddrTable, ulSize); } else { hb_retc(""); } } #pragma ENDDUMP [/pre]

Andrey: SADSTAR33 пишет: вот что получилось А как собирать ? В смысле какую библиотеку еще присоединять ?

Dima: Andrey пишет: В смысле какую библиотеку еще присоединять ? Угадай с 3-х раз :) PS Определить можно за 5 секунд.

Pasha: Я забыл вставить еще раз освобождение памяти: после hb_retclen( (char *) pIPAddrTable, ulSize); надо еще раз вызвать GlobalFree( pIPAddrTable );

SADSTAR33: Andrey пишет: А как собирать ? В смысле какую библиотеку еще присоединять ? iphlpapi.lib лежала в C:\Borland\BCC55\Lib\PSDK копирнул в C:\Borland\BCC55\Lib чтобы доп.пути не прописывать

SADSTAR33: оказывается изобрели очередной велосипед :( Поясняю. В связи с отсутствием приемлемой документации пытался изучать исходники. нашел функцию HB_SOCKETGETIFACES( [ nFamily ], [ lNoAliases ] ) --> aIfaces которая выдает массив с описанием существующих интерфейсов Пример [pre2] +-1:A= ¦ +-1:N= 2 ¦ +-2:C=80.237.3.238 ¦ +-3:N= 19 ¦ +-4:C=80.237.3.238 ¦ +-5:C=255.255.255.240 ¦ +-6:C=255.255.255.255 ¦ +-7:U=NIL ¦ L-8:U=NIL +-2:A= ¦ +-1:N= 2 ¦ +-2:C=192.168.0.20 ¦ +-3:N= 19 ¦ +-4:C=192.168.0.20 ¦ +-5:C=255.255.255.0 ¦ +-6:C=255.255.255.255 ¦ +-7:U=NIL ¦ L-8:U=NIL L-3:A= +-1:N= 2 +-2:C=127.0.0.1 +-3:N= 23 +-4:C=127.0.0.1 +-5:C=255.0.0.0 +-6:C=255.255.255.255 +-7:U=NIL L-8:U=NIL [/pre2] Но не нашел в исходниках - откуда берется информация чтобы понять что есть что в выдаче.

Петр: SADSTAR33 пишет: Но не нашел в исходниках - откуда берется информация чтобы понять что есть что в выда Обратите внимание на hbsocket.ch [pre2]/* Harbour interface information indexes */ #define HB_SOCKET_IFINFO_FAMILY 1 /* adress family */ #define HB_SOCKET_IFINFO_NAME 2 /* interface name */ #define HB_SOCKET_IFINFO_FLAGS 3 /* flags HB_SOCKET_IFF_* */ #define HB_SOCKET_IFINFO_ADDR 4 /* interface address */ #define HB_SOCKET_IFINFO_NETMASK 5 /* subnetmask */ #define HB_SOCKET_IFINFO_BROADCAST 6 /* broadcast address */ #define HB_SOCKET_IFINFO_P2PADDR 7 /* point-to-point address */ #define HB_SOCKET_IFINFO_HWADDR 8 /* hardware address */ [/pre2]



полная версия страницы