Problemas para usar la función GetExtendedTcpTable

Iniciado por el_doctor, 5 Septiembre 2013, 19:13 PM

0 Miembros y 3 Visitantes están viendo este tema.

el_doctor

Saludos estoy haciendo un proceso que me recupere los procesos que están usando una conexión TCP/IP leyendo la documentación MSDN esta función devuelve los datos que necesito pero tengo dudas con el primer parámetro de salida que es donde se recupera la tabla de la estructura con los datos, según la documentación MSDN la sintaxis de la función es la siguiente:

Código (cpp) [Seleccionar]
DWORD GetExtendedTcpTable(
 _Out_    PVOID pTcpTable,
 _Inout_  PDWORD pdwSize,
 _In_     BOOL bOrder,
 _In_     ULONG ulAf,
 _In_     TCP_TABLE_CLASS TableClass,
 _In_     ULONG Reserved
);


el problema que tengo es con el parámetro pTcpTable según entiendo debe ser una estructura de datos que ya existe en "tcpmib.h" pero no se como usar estas estructuras y como recuperaría los datos que envía la función en esta variable.

la función la he definido de la siguiente manera:

Código (cpp) [Seleccionar]
DWORD size;
DWORD dwResult;


dwResult = GetExtendedTcpTable( , size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);


les agradecería me ayudaran en comprender mejor para usar esta función




Una aclaración la variable size no le he asignado ningún valor porque igual como no se que estructura es pTcpTable no puedo darle un valor.

Código (cpp) [Seleccionar]

size = sizeof (PVOID)
//no se que estructura corresponde pTcpTable el tipo lo pone como PVOID

Eternal Idol

#1
La misma funcion te devuelve el tamaño necesario:

pdwSize [in, out]
The estimated size of the structure returned in pTcpTable, in bytes. If this value is set too small, ERROR_INSUFFICIENT_BUFFER is returned by this function, and this field will contain the correct size of the structure.

DWORD size = 0;
DWORD dwResult = GetExtendedTcpTable(NULL, &size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
if (dwResult == ERROR_INSUFFICIENT_BUFFER)
{
 PVOID table = malloc(size);
 dwResult = GetExtendedTcpTable(table, &size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
 if (dwResult == NO_ERROR)
 {
   PMIB_TCPTABLE_OWNER_PID tabla = (PMIB_TCPTABLE_OWNER_PID)table;
 }
 free(table);
}


Y la estructura tambien esta en la documentacion:
TCP_TABLE_CLASS enumeration

TCP_TABLE_OWNER_PID_ALL
A MIB_TCPTABLE_OWNER_PID or MIB_TCP6TABLE_OWNER_PID structure that contains all TCP endpoints on the local computer is returned to the caller.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

Gracias Eternal Idol el código me resulto de mucha utilidad hice algunos cambios lo dejo aquí para que sirva de referencia a otros:

Código (cpp) [Seleccionar]

DWORD size= 64;

LPVOID table = new BYTE[size];


while( dwResult = GetExtendedTcpTable(table, &size, false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0)
== ERROR_INSUFICIENT_BUFFER)
delete [] table, table = new BYTE[size *= 2];

if(dwResut != NO_ERROR)
{
//TODO error
return NULL;
}


PMIB_TCPTABLE_OWNER_PID tabla = (PMIB_TCPTABLE_OWNER_PID)table;


disculpa las molestias pero ahora tengo la duda quiero obtener sólo un registro de toda la lista de estructura es decir hacer un for que me recorra toda la lista pero sólo recuperar dwOwningPid de la estructura MIB_TCPROW_OWNER_PID

Eternal Idol

No tiene mucho sentido hacer ese bucle, como te dije la funcion te devuelve el tamaño que necesita, ir aumentando en 64 (un valor arbitrario), reservar y liberar memoria es poco optimizado.

En el campo dwNumEntries de la estructura MIB_TCPTABLE_OWNER tenes la cantidad de elementos en la tabla. Con eso podes hacer el array facilmente.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

#4
Gracias por tus sugerencias estoy corriendo el código disculpa de que biblioteca son AF_INET y ERROR_INSUFICIENT_BUFFER ya que me da un error de compilación que no están declarados esos identificadores




Salodos lo de "AF_INET" ya encontré en que biblioteca asociada a la dll se encontraba pero sigo sin poder encontrar donde está declarado "ERROR_INSUFICIENT_BUFFER"

Eternal Idol

Es ERROR_INSUFFICIENT_BUFFER, incluyendo windows.h ya te deberia funcionar.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

Gracias Eternal Idol erra un error de sintaxis el mío  :-\

tengo ratos de estar dando lata con esto ahora tengo un problema de conversión cuando hago el for para recorrer la tabla no se si he hecho algo mal si le das una chequeada y me ayudas te lo agradecería.

Código (cpp) [Seleccionar]

for(int i=0; i < (int) pTcpTable->dwNumEntries; i++)



Eternal Idol

No existe la variable pTcpTable (asi se llama el primer parametro de la funcion GetExtendedTcpTable).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

Me dará problemas si la declaro igual que el parámetro de la función???

Eternal Idol

No tengo tu codigo pero inverti un poco mas de esfuerzo y prueba y error por tu cuenta y seguro que logras hacerlo funcionar.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón