Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Obtener conexiones activas (https://www.clubdelphi.com/foros/showthread.php?t=33719)

OSKR 14-07-2006 20:13:29

Obtener conexiones activas
 
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..." :D:D 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 :confused: 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


La franja horaria es GMT +2. Ahora son las 05:23:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi