Hola:
Aquí va una forma de conseguir la mascara en todas las versiones de Windows excepto Windows95.
Si necesitas que funcione también en Win95 tienes que instalar la versión 2 de la libreria Winsock.
[Winsock 2 update]
http://www.microsoft.com/.../W95Sockets2/Default.asp- Creamos un proyecto nuevo y le añadimos un TListBox (ListBox1) y un botón.
- Añadimos las siguientes cabeceras:
Código:
#include <winsock2.h>
#include <ws2tcpip.h>
- Añadimos las siguientes declaraciones en la parte privada de la clase de nuestro form:
Código:
private: // User declarations
// Donde recibiremos la lista de interfaces
INTERFACE_INFO m_interfaceInfo[32];
int __fastcall GetInterfaceInfo(void);
- Implementamos la función GetInterfaceInfo:
Código:
//---------------------------------------------------------------------------
// Devuelve el numero de interfaces
// -1 en caso de error
//---------------------------------------------------------------------------
int __fastcall TForm1::GetInterfaceInfo(void)
{
typedef WINSOCK_API_LINKAGE int WSAAPI (*PFWSAIoctl)(SOCKET, DWORD,
LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED,
LPWSAOVERLAPPED_COMPLETION_ROUTINE);
WSADATA wsaData;
if (WSAStartup(0x0002, &wsaData))
return -1;
// Como no indicas que versión de C++Builder usas
// cargamos dinámicamente la siguiente librería,
// si estas usando BCB5/6 puedes enlazarla estáticamente
// tienes ws2_32.lib en el subdirectorio ...\lib\Psdk
HINSTANCE hLib = LoadLibrary("ws2_32.dll");
if (!hLib)
return -1;
// Obtenemos la direccion de "WSAIoctl" dinamicamente
PFWSAIoctl fWSAIoctl = (PFWSAIoctl)GetProcAddress(hLib, "WSAIoctl");
if (!fWSAIoctl)
{
FreeLibrary(hLib);
return -1;
}
int s = socket(AF_INET, SOCK_RAW, 0);
DWORD dwBytesReturned;
int n = fWSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0,
(LPVOID)&m_interfaceInfo, sizeof(m_interfaceInfo),
&dwBytesReturned, NULL, NULL);
n = (dwBytesReturned > 0) ? dwBytesReturned / sizeof(INTERFACE_INFO) : 0;
closesocket(s);
FreeLibrary(hLib);
WSACleanup();
return n;
}
- Y finalmente el siguiente código en el OnClick del botón:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Clear();
int num = GetInterfaceInfo();
for (int i=0; i<num; ++i)
{
String addr = inet_ntoa(m_interfaceInfo[i].iiAddress.AddressIn.sin_addr);
String mask = inet_ntoa(m_interfaceInfo[i].iiNetmask.AddressIn.sin_addr);
DWORD flags = m_interfaceInfo[i].iiFlags;
ListBox1->Items->Add("Addr: " + addr);
ListBox1->Items->Add("Mask: " + mask);
ListBox1->Items->Add("Flags:"
+ String(flags & IFF_UP ? " IFF_UP" : "")
+ String(flags & IFF_BROADCAST ? " IFF_BROADCAST" : "")
+ String(flags & IFF_LOOPBACK ? " IFF_LOOPBACK" : "")
+ String(flags & IFF_POINTTOPOINT ? " IFF_POINTTOPOINT" : "")
+ String(flags & IFF_MULTICAST ? " IFF_MULTICAST" : "") );
ListBox1->Items->Add("---");
}
}
Conozco otras maneras de hacerlo, pero requieren de Windows 98 o superior.
-----------------------------------------------------------------------------------------------
Aquí tienes otra manera de conseguir los datos. Tal como esta funciona en el BCB6 y en todas las versiones de Windows excepto el 95.
En otras versiones de C++Builder habría que cargar dinámicamente la dll necesaria o generar la librería de importación correspondiente y además crear las estructuras y tipos necesarios ya que el resto de versiones no trae las cabeceras necesarias, al menos desde el BCB4 para atrás, no recuerdo si el BCB5 ya las tenia actualizadas.
- Añadimos un TListBox (ListBox1) a nuestro proyecto y luego las lineas siguientes:
Código:
#include <iphlpapi.h>
// Corregir aquí la ruta segun donde tengamos instalado nuestro BCB
#pragma link "c:/borland/cbuilder6/lib/psdk/iphlpapi.lib"
- Y finalmente el siguiente código en el constructor del form:
Código:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
IP_ADAPTER_INFO AdapterInfo[20], *pAdapterInfo;
ULONG bufferLen = sizeof(AdapterInfo);
pAdapterInfo = AdapterInfo;
GetAdaptersInfo(pAdapterInfo, &bufferLen);
while(pAdapterInfo)
{
String sName = pAdapterInfo->Description;
String sIp = pAdapterInfo->IpAddressList.IpAddress.String;
String sMask = pAdapterInfo->IpAddressList.IpMask.String;
ListBox1->Items->Add("Adaptador: " + sName);
ListBox1->Items->Add("IP: " + sIp);
ListBox1->Items->Add("Mascara: " + sMask);
ListBox1->Items->Add("---");
pAdapterInfo = pAdapterInfo->Next;
}
}
Fíjate en la documentación de la función GetAdaptersInfo y la estructura IP_ADAPTER_INFO donde obtenemos más información de la que se muestra en el ejemplo.
Autor del Código
_Leo
Ubicación: Lanzarote - Islas Canarias (España)