Форум » [x]Harbour » Как узнать IP адрес компьютера ? » Ответить

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

Andrey: Всем привет... Подскажите как можно из программы узнать IP адрес компа ? И какой он, динамический или статический ?

Ответов - 18

Pager: Где-то в инете было что-то вроде этого: //Функция определяющая Имя компьютера и имя пользователя //и возвращающая массив IP адресов компа //GetIpStation(@cName,@cUserName)->aHosts FUNCTION GetIpStation(cName,cUserName) LOCAL aHosts:=NIL cName:=NetName(.F.) //F имя компьютера cUserName:=NetName(.T.) //.T. имя пользователя InetInit() aHosts := InetGetHosts(cName) IF aHosts == NIL aHosts := InetGetAlias(cName) ENDIF InetCleanup() RETURN aHosts а статический IP или динамический, это наверное через реестр надо узнавать!

k_dima: Отсюда можно узнать все, например 4-й элемент возвращаемого массива ip-адрес // Fetches the MAC address and prints it HB_FUNC( GETMACADDRESSES ) { IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information // for up to 16 NICs // http://msdn2.microsoft.com/En-US/library/aa366062.aspx DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo AdapterInfo, // [out] buffer to receive data &dwBufLen); // [in] size of receive data buffer PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to // current adapter info char cMacAddress[18]; PHB_ITEM pItem; PHB_ITEM paAddress = hb_itemArrayNew( 0 ); // Verify return value is valid, no buffer overflow... if (dwStatus != ERROR_SUCCESS) { hb_itemRelease(hb_itemReturn(paAddress)); return; } pItem = hb_itemNew(NULL); do { PHB_ITEM pSubArray = hb_itemArrayNew(10); // Description of NIC hb_arraySet(pSubArray, 1, hb_itemPutC(pItem, pAdapterInfo->Description)); // MAC address sprintf( cMacAddress, "%02X-%02X-%02X-%02X-%02X-%02X", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[4], pAdapterInfo->Address[5]); hb_strUpper( cMacAddress, strlen(cMacAddress)); hb_arraySet(pSubArray, 2, hb_itemPutC(pItem, cMacAddress )); // GUID of NIC hb_arraySet(pSubArray, 3, hb_itemPutC(pItem, pAdapterInfo->AdapterName)); // IP Address hb_arraySet(pSubArray, 4, hb_itemPutC(pItem, pAdapterInfo->IpAddressList.IpAddress.String )); // IP Mask hb_arraySet(pSubArray, 5, hb_itemPutC(pItem, pAdapterInfo->IpAddressList.IpMask.String )); // IP Gateway hb_arraySet(pSubArray, 6, hb_itemPutC(pItem, pAdapterInfo->GatewayList.IpAddress.String )); // DHCP server IP & Lease Obtained if (pAdapterInfo->DhcpEnabled) { hb_arraySet(pSubArray, 7, hb_itemPutC( pItem, pAdapterInfo->DhcpServer.IpAddress.String )); hb_arraySet(pSubArray, 8, hb_itemPutNL(pItem, pAdapterInfo->LeaseObtained )); } else { hb_arraySet(pSubArray, 7, hb_itemPutC( pItem, "" )); hb_arraySet(pSubArray, 8, hb_itemPutNI(pItem, 0 )); } // WINS server info - Primary & Secondary ip address if (pAdapterInfo->HaveWins) { hb_arraySet(pSubArray, 9, hb_itemPutC( pItem, pAdapterInfo->PrimaryWinsServer.IpAddress.String )); hb_arraySet(pSubArray, 10, hb_itemPutC( pItem, pAdapterInfo->SecondaryWinsServer.IpAddress.String )); } else { hb_arraySet(pSubArray, 9, hb_itemPutC( pItem, "" )); hb_arraySet(pSubArray, 10, hb_itemPutC( pItem, "" )); } hb_arrayAdd(paAddress, pSubArray); hb_itemRelease(pSubArray); pAdapterInfo = pAdapterInfo->Next; // Progress through // linked list } while(pAdapterInfo); // Terminate if last adapter hb_itemRelease(pItem); hb_itemRelease(hb_itemReturn(paAddress)); }

SkyNET: Здравствуйте ! А как его вызывать ??? Попробовал вот, что: Procedure Main() Clear screen ? GETMACADDRESSES() wait Return /////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> // Fetches the MAC address and prints it HB_FUNC( GETMACADDRESSES ) { IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information // for up to 16 NICs // http://msdn2.microsoft.com/En-US/library/aa366062.aspx DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo AdapterInfo, // [out] buffer to receive data &dwBufLen); // [in] size of receive data buffer PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to // current adapter info char cMacAddress[18]; PHB_ITEM pItem; PHB_ITEM paAddress = hb_itemArrayNew( 0 ); // Verify return value is valid, no buffer overflow... if (dwStatus != ERROR_SUCCESS) { hb_itemRelease(hb_itemReturn(paAddress)); return; } pItem = hb_itemNew(NULL); do { PHB_ITEM pSubArray = hb_itemArrayNew(10); // Description of NIC hb_arraySet(pSubArray, 1, hb_itemPutC(pItem, pAdapterInfo->Description)); // MAC address sprintf( cMacAddress, "%02X-%02X-%02X-%02X-%02X-%02X", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[4], pAdapterInfo->Address[5]); hb_strUpper( cMacAddress, strlen(cMacAddress)); hb_arraySet(pSubArray, 2, hb_itemPutC(pItem, cMacAddress )); // GUID of NIC hb_arraySet(pSubArray, 3, hb_itemPutC(pItem, pAdapterInfo->AdapterName)); // IP Address hb_arraySet(pSubArray, 4, hb_itemPutC(pItem, pAdapterInfo->IpAddressList.IpAddress.String )); // IP Mask hb_arraySet(pSubArray, 5, hb_itemPutC(pItem, pAdapterInfo->IpAddressList.IpMask.String )); // IP Gateway hb_arraySet(pSubArray, 6, hb_itemPutC(pItem, pAdapterInfo->GatewayList.IpAddress.String )); // DHCP server IP & Lease Obtained if (pAdapterInfo->DhcpEnabled) { hb_arraySet(pSubArray, 7, hb_itemPutC( pItem, pAdapterInfo->DhcpServer.IpAddress.String )); hb_arraySet(pSubArray, 8, hb_itemPutNL(pItem, pAdapterInfo->LeaseObtained )); } else { hb_arraySet(pSubArray, 7, hb_itemPutC( pItem, "" )); hb_arraySet(pSubArray, 8, hb_itemPutNI(pItem, 0 )); } // WINS server info - Primary & Secondary ip address if (pAdapterInfo->HaveWins) { hb_arraySet(pSubArray, 9, hb_itemPutC( pItem, pAdapterInfo->PrimaryWinsServer.IpAddress.String )); hb_arraySet(pSubArray, 10, hb_itemPutC( pItem, pAdapterInfo->SecondaryWinsServer.IpAddress.String )); } else { hb_arraySet(pSubArray, 9, hb_itemPutC( pItem, "" )); hb_arraySet(pSubArray, 10, hb_itemPutC( pItem, "" )); } hb_arrayAdd(paAddress, pSubArray); hb_itemRelease(pSubArray); pAdapterInfo = pAdapterInfo->Next; // Progress through // linked list } while(pAdapterInfo); // Terminate if last adapter hb_itemRelease(pItem); hb_itemRelease(hb_itemReturn(paAddress)); } #pragma ENDDUMP Но он выдаёт множество Type mismatch ошибок...


k_dima: добавь #include <iphlpapi.h>

SkyNET: Ещё 14 ошибок выдаёт... Файл прилагаю

k_dima: там выдает ошибки об отсутствии прототипов xharbour функций - добавь еще #include "hbapiitm.h" #include "hbvm.h"

SkyNET: Выдает теперь всего одну ошибку: Error: Unresolved external 'GetAdaptersInfo' referenced from W:\IP2.OBJ

Pasha: SkyNET пишет: Выдает теперь всего одну ошибку: Error: Unresolved external 'GetAdaptersInfo' referenced from W:\IP2.OBJ При линковке надо указать библиотеку iphlpapi.lib см.тему http://clipper.borda.ru/?1-4-0-00000255-000-0-0-1232701680 тоже самое справедливо и для функций winapi

SkyNET: Спасибо большое всем ! Выкладываю рабочий пример: Procedure Main() LOCAL aDim, nI, nJ Clear screen ? "Текущий пользователь: ", HB_ANSITOOEM(NetName(.T.)) ? "Имя компьютера: ", HB_ANSITOOEM(NetName(.F.)) ? aDim:=GetIpStation() For nI:=1 to LEN(aDim) ? "IP адрес "+ALLTRIM(STR(nI))+": "+aDim[nI] Next ? // Вызов функции из библиотеки ..\BCC55\Lib\PSDK\iphlpapi.lib // необходимо ее прилинковать к проекту. aDim := GETMACADDRESSES() For nI:=1 to LEN(aDim) ? "-"+ALLTRIM(STR(nI))+": " //,VALTYPE(aDim[nI]),LEN(aDim[nI]) FOR nJ := 1 TO 5 //LEN(aDim[nI]) ? " "+ALLTRIM(STR(nJ))+"- ",HB_ANSITOOEM(aDim[nI,nJ]) NEXT Next wait Return //Функция определяющая Имя компьютера и имя пользователя //и возвращающая массив IP адресов компа //GetIpStation(@cName,@cUserName)->aHosts FUNCTION GetIpStation(cName,cUserName) LOCAL aHosts:=NIL cName:=NetName(.F.) //F имя компьютера cUserName:=NetName(.T.) //.T. имя пользователя InetInit() aHosts := InetGetHosts(cName) IF aHosts == NIL aHosts := InetGetAlias(cName) ENDIF InetCleanup() RETURN aHosts /////////////////////////////////////////////////////////// #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> #include <iphlpapi.h> #include "hbapiitm.h" #include "hbvm.h" // Fetches the MAC address and prints it HB_FUNC( GETMACADDRESSES ) { IP_ADAPTER_INFO AdapterInfo[16]; // Allocate information // for up to 16 NICs // http://msdn2.microsoft.com/En-US/library/aa366062.aspx DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo AdapterInfo, // [out] buffer to receive data &dwBufLen); // [in] size of receive data buffer PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; // Contains pointer to // current adapter info char cMacAddress[18]; PHB_ITEM pItem; PHB_ITEM paAddress = hb_itemArrayNew( 0 ); // Verify return value is valid, no buffer overflow... if (dwStatus != ERROR_SUCCESS) { hb_itemRelease(hb_itemReturn(paAddress)); return; } pItem = hb_itemNew(NULL); do { PHB_ITEM pSubArray = hb_itemArrayNew(10); // Description of NIC hb_arraySet(pSubArray, 1, hb_itemPutC(pItem, pAdapterInfo->Description)); // MAC address sprintf( cMacAddress, "%02X-%02X-%02X-%02X-%02X-%02X", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[4], pAdapterInfo->Address[5]); hb_strUpper( cMacAddress, strlen(cMacAddress)); hb_arraySet(pSubArray, 2, hb_itemPutC(pItem, cMacAddress )); // GUID of NIC hb_arraySet(pSubArray, 3, hb_itemPutC(pItem, pAdapterInfo->AdapterName)); // IP Address hb_arraySet(pSubArray, 4, hb_itemPutC(pItem, pAdapterInfo->IpAddressList.IpAddress.String )); // IP Mask hb_arraySet(pSubArray, 5, hb_itemPutC(pItem, pAdapterInfo->IpAddressList.IpMask.String )); // IP Gateway hb_arraySet(pSubArray, 6, hb_itemPutC(pItem, pAdapterInfo->GatewayList.IpAddress.String )); // DHCP server IP & Lease Obtained if (pAdapterInfo->DhcpEnabled) { hb_arraySet(pSubArray, 7, hb_itemPutC( pItem, pAdapterInfo->DhcpServer.IpAddress.String )); hb_arraySet(pSubArray, 8, hb_itemPutNL(pItem, pAdapterInfo->LeaseObtained )); } else { hb_arraySet(pSubArray, 7, hb_itemPutC( pItem, "" )); hb_arraySet(pSubArray, 8, hb_itemPutNI(pItem, 0 )); } // WINS server info - Primary & Secondary ip address if (pAdapterInfo->HaveWins) { hb_arraySet(pSubArray, 9, hb_itemPutC( pItem, pAdapterInfo->PrimaryWinsServer.IpAddress.String )); hb_arraySet(pSubArray, 10, hb_itemPutC( pItem, pAdapterInfo->SecondaryWinsServer.IpAddress.String )); } else { hb_arraySet(pSubArray, 9, hb_itemPutC( pItem, "" )); hb_arraySet(pSubArray, 10, hb_itemPutC( pItem, "" )); } hb_arrayAdd(paAddress, pSubArray); hb_itemRelease(pSubArray); pAdapterInfo = pAdapterInfo->Next; // Progress through // linked list } while(pAdapterInfo); // Terminate if last adapter hb_itemRelease(pItem); hb_itemRelease(hb_itemReturn(paAddress)); } #pragma ENDDUMP

SkyNET: Кто может подсказать расшифровку: -1: 1- Realtek RTL8169/8110 Family Gigabit Ethernet NIC - Минипорт планировщика пакетов 2- 00-16-17-93-26-BE 3- {F51B2DB7-F494-4E60-BB11-AEBEC436ACBF} 4- 11.61.201.3 5- 255.255.255.0 -2: 1- WAN (PPP/SLIP) Interface 2- 00-53-45-00-00-00 3- {D93658A8-7789-4FBF-8AD4-9A12CABA8A2D} 4- 61.25.245.40 5- 255.255.255.255 1) Это - сетевуха 2) Физический адрес (МАС) сетевухи 3) ??? - Что ЭТО ? 4) и 5) сами адреса.

LYSK: Я предполагаю догадку, что это ОЕМ-код PCI-устройства.

SADSTAR2: 5 - маска подсетки

fil: А можно ли узнать macaddress карты принтсервера зная его IP ?

Петр: пробуйте nbtstat -a ххх.ххх.ххх.ххх

fil: Не, не пойдет. Для любого принтера дает MAC 00-00-00-00-00

fil: Похоже, это можно решить через ARP. Правда таблица соответствий IP-MAC хранится тока на текущий момент, но ее всегда можно обновить пинганув любой из известных IP. Хотелось бы еще определять уникальность всяких локальных USB устройств(сканеров, принтеров)

Andrey: Всем привет. Переделал функцию для Харбора: [pre2]// Функция возвращающая массив IP адресов компа FUNCTION GetIpStation() LOCAL cName, aHosts := NIL cName:=NetName(.F.) //F имя компьютера InetInit() aHosts := InetGetHosts(cName) IF aHosts == NIL aHosts := InetGetAlias(cName) ENDIF InetCleanup() RETURN aHosts [/pre2] Не собирается прога, пишет ошибку: Harbour 3.2.0dev (r1803161710) Copyright (c) 1999-2018, https://harbour.github.io/ OBJ\demo.c: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external '_HB_FUN_INETINIT' referenced from W:\HB_PROJECT\PROJECT\GETINFOAPPLICATION\OBJ\DEMO.OBJ Error: Unresolved external '_HB_FUN_INETGETHOSTS' referenced from W:\HB_PROJECT\PROJECT\GETINFOAPPLICATION\OBJ\DEMO.OBJ Error: Unresolved external '_HB_FUN_INETGETALIAS' referenced from W:\HB_PROJECT\PROJECT\GETINFOAPPLICATION\OBJ\DEMO.OBJ Error: Unresolved external '_HB_FUN_INETCLEANUP' referenced from W:\HB_PROJECT\PROJECT\GETINFOAPPLICATION\OBJ\DEMO.OBJ hbmk2[demo]: Error: Running linker. 2 Прочитал совет Pasha пишет: Если при линковке вы увидите такую ошибку, то не спешите задавать вопрос "У меня такая-то ошибка, что мне делать ?" Сначала поищите в каталоге Harbour\lib текст "HB_FUN_<имя>" Если в какой-то либе такой текст найдется, просто добавьте ее в список библиотек для сборки программы Список большой получается: [pre2]hbextern.lib hbrtl.lib hbssl.lib hbssls.lib hbtip.lib xhb.lib[/pre2] Какую библиотеку нужно добавить к себе в проект, чтобы заработала эта функция ?

Andrey: Вопрос снят. Нашёл методом перебора - xhb.lib !



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