(50 puntos) ¿Cómo obtiene MFC la dirección IP de un host en la misma LAN?
Las computadoras que acceden a Internet a través de una LAN no tienen una IP pública en la Web. Todas las máquinas en una LAN usan la misma IP, pero los puertos proporcionados a la puerta de enlace son puertos diferentes y dinámicos. El ciclo es muy pequeño
Si usa VC, puede conocer las direcciones IP de todos los hosts en esta LAN. El método es el siguiente:
BOOL CIPWnd::GetLanComputers(LPNETRESOURCE lpnr. ,HTREEITEM hNode)
{
DWORD dwResult,dwResultEnum,dwDsptype,dwIP
DWORD cbBuffer = 16384 /* 16K es un tamaño razonable */ ; p>
DWORD cEntries = 0xFFFFFFFF; /* enumera todas las entradas posibles */
LPNETRESOURCE lpnrLocal; /* puntero a estructuras enumeradas */
char * ptr; >
pcinfo * pPcinfo ;
struct hostent FAR * pHostent;
HANDLE hEnum;
dwResult=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,lpnr, &hEnum);
if (dwResult ==67) //No hay ningún host accesible bajo el dominio
return TRUE
if (dwResult != NO_ERROR )
return FALSE;
{
lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer); /* identificador de recurso */
&cEntries, /* definido localmente como 0xFFFFFFFF */
lpnrLocal, /* LPNETRESOURCE
*/
&cbBuffer); /* tamaño del búfer */
if (dwResultEnum == NO_ERROR)
{
if (! g_pThread) devuelve FALSO;
for(DWORD i = 0; i < cEntries; i++)
{
if (!g_pThread) devuelve FALSO
p> p>dwDsptype=(lpnrLocal+i)->dwDisplayType;
// RESOURCEDISPLAYTYPE_DOMAIN 0x00000001
// RESOURCEDISPLAYTYPE_SERVER 0x00000002
// RESOURCEDISPLAYTYPE_GROUP 0x000000 05
// RESOURCEDISPLAYTYPE_NETWORK 0x00000006
if (dwDsptype==1||dwDsptype==2||dwDsptype==5||dwDsptype==6)
{
m_treeview.SendMessage(TVM_EXPAND,TVE_EXPAND,(long)hNode
if (dwDsptype==2)
{
ptr=(lpnrLocal+i)->lpRemoteName+2;
pHosten = gethostbyname(ptr);
if (!g_pThread) devuelve FALSO; p> if (pHostent)
{
memcpy(&dwIP, pHosten->h_addr_list[0], pHosten->h_length
pPcinfo=new pcinfo);
pPcinfo->uIP=dwIP
p>
pPcinfo->iflag=0;
pPcinfo->totalBytes=0;
pPcinfo->totalPacks=0
ZeroMemory(pPcinfo; ->szName,MAX_HOSTNAME_LAN);
memcpy(pPcinfo->szName,ptr,strlen(ptr));
m_pcArr.Add(pPcinfo
); }
más
dwIP=0
}
más
{
ptr=(lpnrLocal+i)->lpRemoteName;
dwIP=0;
}
HTREEITEM hNode1=m_treeview.InsertItem(ptr,hNode);
m_treeview.SetItemData(hNode1,dwIP);
if(RESOURCEUSAGE_CONTAINER == ((lpnrLocal+i)->dwUsage & RESOURCEUSAGE_CONTAINER) && (dwDsptype==1||dwDsptype= =5||dwDsptype==6))
{
m_treeview.SendMessage(TVM_EXPAND,TVE_EXPAND,(long)hNode1;
GetLanComputers((lpnrLocal); +i),hNodo1);
}
}
}
}
GlobalFree((HGLOBAL) ) lpnrLocal);
}
WNetCloseEnum(hEnum);
devuelve VERDADERO; Puedes consultarlo online
/vchelp/archive.asp?type_id=39&class_id=1&cata_id=5&article_id=653