Igual q el anterior, no se si alguien ya lo ha publicado o no..."su misión...si deciden aceptarla...traducirla vuestro delphi del alma...publicarla en trucos si asi lo desean....este tema se autodestruira en 5 segundos..."
no... es paja!!!
Código:
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <iphlpapi.h>
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
struct TCPROW
{ DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
};
struct TCPTABLE
{ DWORD dwNumEntries;
TCPROW table[100];
};
//---------------------------------------------------------------------------
AnsiString State(int status)
{ AnsiString sstate="";
switch(status)
{ case MIB_TCP_STATE_CLOSED: sstate = "CLOSED"; break;
case MIB_TCP_STATE_LISTEN: sstate = "LISTEN"; break;
case MIB_TCP_STATE_SYN_SENT: sstate = "SYN_SENT"; break;
case MIB_TCP_STATE_SYN_RCVD: sstate = "SYN_RCVD"; break;
case MIB_TCP_STATE_ESTAB: sstate = "ESTAB"; break;
case MIB_TCP_STATE_FIN_WAIT1: sstate = "FIN_WAIT1"; break;
case MIB_TCP_STATE_FIN_WAIT2: sstate = "FIN_WAIT2"; break;
case MIB_TCP_STATE_CLOSE_WAIT: sstate = "CLOSE_WAIT"; break;
case MIB_TCP_STATE_CLOSING: sstate = "CLOSING"; break;
case MIB_TCP_STATE_LAST_ACK: sstate = "LAST_ACK"; break;
case MIB_TCP_STATE_TIME_WAIT: sstate = "TIME_WAIT"; break;
case MIB_TCP_STATE_DELETE_TCB: sstate = "DELETE_TCB"; break;
}
return sstate;
}
void Error(HANDLE Handle, int Error=0)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL);
MessageBox( NULL, (char *)lpMsgBuf,"GetLastError", MB_OK|MB_ICONINFORMATION);
LocalFree( lpMsgBuf );
if( Handle)
FreeLibrary(Handle);
// exit(0);
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{ DWORD (*GTT)(TCPTABLE *,PDWORD,BOOL);
TCPTABLE TT;
HANDLE Handle=LoadLibrary("Iphlpapi.dll");
if(!Handle)
Error(0);
GTT=(DWORD (*)(TCPTABLE *,PDWORD,BOOL))GetProcAddress(Handle,"GetTcpTable");
if(!GTT)
Error(Handle);
DWORD Size = 100*sizeof(TCPTABLE)+4;
DWORD j,dwRetVal;
printf("Status LocalAddrss:LocalPort RemoteAddrss:RemotePort\n");
dwRetVal = GTT(&TT, &Size, true);
j=TT.dwNumEntries; //Capturamos el total
if( dwRetVal == NO_ERROR)
for(int i = 0; i < j; i++)
{ printf("%10s ",State(TT.table[i].dwState).c_str());
unsigned short Puerto;
char LA[5]={0};
memcpy(&LA,&TT.table[i].dwLocalAddr,4);
Puerto=ntohs((unsigned short)TT.table[i].dwLocalPort);
printf("%d.%d.%d.%d:%d ",(int)LA[0],(int)LA[1],(int)LA[2],(int)LA[3],Puerto);
memcpy(&LA,&(TT.table[i].dwRemoteAddr),4);
Puerto=ntohs((unsigned short)TT.table[i].dwRemotePort);
printf("%d.%d.%d.%d:%d \n",(int)LA[0],(int)LA[1],(int)LA[2],(int)LA[3],Puerto);
}
Error(0);
return 0;
}
-El segundo parametro de la funcion Error no lo use al fin y al cabo.
-Redefini las estructuras y cargo la funcion de la DLL y no uso la definida en la libreria iphlpapi.h xq al igual q GetExtendedTcpTable....1 de cada 20 veces funciona...el resto se tira el error 87 (parametro incorrecto).
-La estructura TCPTABLE es una redefinicion donde la original tenia una sola posicion, al intentar leer esa data (como cantidad de entradas o la primera fila) se corrompia por completo la primera incluso la cantidad, el resto se mantenia
extraño verdad? hice los mil y un artilugios pero nada!!!, me toco expandir ese vector pa saber si funcionaba o no la cosa. si alguien encuentra el detallito y puede arreglarlo...q lo arregle.....tengo otras vainas encima q hacer
.
-Ni se les ocurra pensar q el error es por intentar almacenar mas posiciones q las disponibles, ya todo fué probado correctamente y por fallas sin explicación alguna...vino la redificion