p/invoke y GetTcpStatistics

23/11/2006 - 22:32 por RAlvare | Informe spam
Hola a todos.

Tengo el código siguiente:



using System.Runtime.InteropServices;

class FuncionesAyudaIP

{

[DllImport("iphlpapi.dll")]

public static extern int GetTcpStatistics(ref MIB_TCPSTATS pStats);

//en esta estructura se reciben las estadísticas del protocolo TCP:

public struct MIB_TCPSTATS

{

int dwRtoAlgorithm;

int dwRtoMin;

int dwRtoMax;

int dwMaxConn;

int dwActiveOpens;

int dwPassiveOpens;

int dwAttemptFails;

int dwEstabResets;

int dwCurrEstab;

int dwInSegs;

int dwOutSegs;

int dwRetransSegs;

int dwInErrs;

int dwOutRsts;

int dwNumConns;

}



public int ObtenerEstadisticasTCP(ref MIB_TCPSTATS mibTCP)

{ return GetTcpStatistics(ref mibTCP); }

}



y en el form_load:



private void Form1_Load(object sender, EventArgs e)

{

FuncionesAyudaIP ipHelper = new FuncionesAyudaIP();

FuncionesAyudaIP.MIB_TCPSTATS mibTCP = new FuncionesAyudaIP.MIB_TCPSTATS();

ipHelper.ObtenerEstadisticasTCP(ref mibTCP);

}



Cuando utilizo la función GetIpStatistics (con la estructura adecuada,
MIB_IPSTATS que es otra diferente a la que os he puesto aqui) recibo sin
problemas los datos de estadísticas del protocolo IP, pero con la función
GetTcpStatistics me salen a cero todos los campos de la estructura
estadísticas de TCP.

No veo que puede estar pasando. ¿podeis probarlo alguno de vosotros a ver si
os sucede lo mismo?.

Un saludo y gracias.

P.D.

Estructura para TCP:

public struct MIB_IPSTATS

{

int dwForwarding;

int dwDefaultTTL;

int dwInReceives;

int dwInHdrErrors;

int dwInAddrErrors;

int dwForwDatagrams;

int dwInUnknownProtos;

int dwInDiscards;

int dwInDelivers;

int dwOutRequests;

int dwRoutingDiscards;

int dwOutDiscards;

int dwOutNoRoutes;

int dwReasmTimeout;

int dwReasmReqds;

int dwReasmOks;

int dwReasmFails;

int dwFragOks;

int dwFragFails;

int dwFragCreates;

int dwNumIf;

int dwNumAddr;

int dwNumRoutes;

}

[DllImport("iphlpapi.dll")]

public static extern int GetIpStatistics (ref MIB_IPSTATS mib);
 

Leer las respuestas

#1 RAlvare
24/11/2006 - 20:55 | Informe spam
Con este cambio ya me ha quedado funcionando perfectamente:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MIB_TCPSTATS

{

int dwRtoAlgorithm; //algoritmo de temporización de las retransmisiones

//posibles valores de esta variable:

//MIB_TCP_RTO_OTHER valor 1 otro

//MIB_TCP_RTO_CONSTANT valor 2 Temporizador constante

//MIB_TCP_RTO_RSRE valor 3 según MIL-STD-1778 Appendix B

//MIB_TCP_RTO_VANJ valor 4 Algoritmo de Van Jacobson (de los Jacobson de
tola vida)


int dwRtoMin; //Valor mínimo del temporizador de retransmisiones en
milisegundos

int dwRtoMax; //Valor máximo del temporizador de retransmisiones en
milisegundos

int dwMaxConn; //Número máximo de conexiones. Si su valor es -1 significa
num. de conex. dinámico

int dwActiveOpens; //puertos en estado Active Open (enviado SYN al servidor)

int dwPassiveOpens; //puertos en esto Passive Open

int dwAttemptFails; //número de intentos de conexión fallidos

int dwEstabResets; //número de conexiones establecidas reiniciadas

int dwCurrEstab; //número de conexiones actualmente establecidas

int dwInSegs; //número de segmentos recibidos

int dwOutSegs; //número de segmentos transmitidos. No incluye los
retransmitidos.

int dwRetransSegs; //número de segmentos retransmitidos.

int dwInErrs; //errores recibidos

int dwOutRsts; //segmentos retransmitidos con bandera de reset (los 6 bits
del campo "flags" de la cabecera

//TCP marcando el estado RST)

int dwNumConns; //número de conexiones presentes en el sistema. Incluye
todos los estados excepto Listening

}

Preguntas similares