<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2900.2995" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT size=2>Pcap_stats_ex expects you (i.e. the caller) to allocate the
pcap_stat structure. The right code should be something like</FONT></DIV>
<DIV><FONT size=2></FONT> </DIV>
<DIV><FONT size=2><FONT size=3>struct pcap_stat
estadisticas;</FONT></FONT></DIV>
<DIV><FONT size=2><FONT size=3></FONT></FONT> </DIV>
<DIV><FONT size=2><FONT
size=3>pcap_stats_ex(descriptor,&estadisticas);</FONT><BR></FONT></DIV>
<DIV><FONT size=2>Hope it helps</FONT></DIV>
<DIV><FONT size=2>GV</FONT></DIV>
<DIV><FONT size=2> </DIV>
<DIV><BR></DIV></FONT>
<BLOCKQUOTE
style="PADDING-RIGHT: 0px; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #000000 2px solid; MARGIN-RIGHT: 0px">
<DIV style="FONT: 10pt arial">----- Original Message ----- </DIV>
<DIV
style="BACKGROUND: #e4e4e4; FONT: 10pt arial; font-color: black"><B>From:</B>
<A title=antonio.ocampo@gmail.com
href="mailto:antonio.ocampo@gmail.com">Antonio Ocampo</A> </DIV>
<DIV style="FONT: 10pt arial"><B>To:</B> <A title=winpcap-users@winpcap.org
href="mailto:winpcap-users@winpcap.org">winpcap-users@winpcap.org</A> </DIV>
<DIV style="FONT: 10pt arial"><B>Sent:</B> Tuesday, November 28, 2006 2:16
PM</DIV>
<DIV style="FONT: 10pt arial"><B>Subject:</B> [Winpcap-users]
pcap_stats_ex</DIV>
<DIV><BR></DIV>
<DIV>Hi for all</DIV>
<DIV> </DIV>
<DIV>When i add this line to my code</DIV>
<DIV> </DIV>
<DIV>pcap_stats_ex(descriptor,estadisticas);</DIV>
<DIV> </DIV>
<DIV>it crashed :(</DIV>
<DIV> </DIV>
<DIV>
<P>#ifndef WIN32<BR> #include <sys/socket.h><BR> #include
<netinet/in.h><BR>#else<BR> #include
<winsock.h><BR>#endif</P>
<P>#include <stdlib.h><BR>#include <time.h><BR>#include
<math.h><BR>#include "pcap.h"</P>
<P> </P>
<P>/* Convierte una dirección IPv4 numérica a cadena*/<BR>char *iptos(u_long
in)<BR>{<BR> static char output[12][3*4+3+1];<BR> static int
res;<BR> u_char *p;</P>
<P> p = (u_char *)&in;<BR> res = (res + 1 == 12 ? 0 : res +
1);<BR> sprintf(output[res], "%d.%d.%d.%d", p[0], p[1], p[2],
p[3]);<BR> return output[res];<BR>}</P>
<P><BR>#ifndef __MINGW32__ /* Cygnus no soporta IPv6 */<BR>/* Convierte una
dirección IPv6 numérica a cadena*/</P>
<P>char* ip6tos(struct sockaddr *sockaddr, char *address, int
addrlen)<BR>{<BR> socklen_t sockaddrlen;</P>
<P> #ifdef WIN32<BR> sockaddrlen = sizeof(struct
sockaddr_in6);<BR> #else<BR> sockaddrlen = sizeof(struct
sockaddr_storage);<BR> #endif</P>
<P> if(getnameinfo(sockaddr,sockaddrlen,address,addrlen,NULL,0, NI_NUMERICHOST)!=
0)<BR> address = NULL;</P>
<P> return address;<BR>}<BR>#endif /* __MINGW32__ */</P>
<P><FONT size=2></FONT><BR>/* Imprime la informacion disponible de una
interfaz dada */</P>
<P>void describe(pcap_if_t *d, int n)<BR>{<BR> pcap_addr_t *a;<BR>
char ip6str[128];</P>
<P> printf("%d. %s\n",n,d->name);</P>
<P> if (d->description)<BR> printf("\tDescripcion:
%s\n",d->description); <BR> <BR>
else<BR> printf("\tDescripcion no disponible\n");<BR>
<BR> printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?
"Si":"No"); /* Loopback Address*/ <BR> <BR>
for(a=d->addresses;a;a=a->next) /* direcciones
IP */<BR> {<BR> printf("\tFamilia de direcciones:
#%d\n",a->addr->sa_family);<BR> <BR>
switch(a->addr->sa_family)<BR> {
<BR> case
AF_INET:<BR> printf("\tNombre de la
familia de direcciones :
AF_INET\n");<BR> if (a->addr)
printf("\tDireccion: %s\n",iptos(((struct sockaddr_in
*)a->addr)->sin_addr.s_addr));
<BR> if
(a->netmask)printf("\tMascara de Subred: %s\n",iptos(((struct sockaddr_in
*)a->netmask)->sin_addr.s_addr));<BR>
if (a->broadaddr) printf("\tDireccion de Broadcast: %s\n",iptos(((struct
sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
<BR> if (a->dstaddr)
printf("\tDireccion de Destino: %s\n",iptos(((struct sockaddr_in
*)a->dstaddr)->sin_addr.s_addr));<BR>
break;</P>
<P> case AF_INET6:<BR>
printf("\tNombre de la familia de direcciones : AF_INET6\n");
<BR> #ifndef __MINGW32__ /* Cygnus
no soporta IPv6 */<BR> if
(a->addr) printf("\tDireccion: %s\n", ip6tos(a->addr, ip6str,
sizeof(ip6str))); <BR>
#endif<BR> break;</P>
<P>
default:
<BR> printf("\tNombre desconocido de
la familia de direcciones\n");<BR>
break;<BR> }<BR> }<BR> <BR>
printf("\n");<BR>}</P>
<P><BR>/* Funciones principales */</P>
<P>int id_nic,cantidad_paquetes;<BR>pcap_if_t *nics,*d;<BR>struct pcap_stat
*estadisticas;<BR>char buffer_error[PCAP_ERRBUF_SIZE];<BR>double
retardo[65536];</P>
<P>void reconoce_nics_y_elige_una()<BR>{<BR> int
i;<BR> <BR> system("cls");</P>
<P> /* Captura la lista de NICs
*/<BR> if(pcap_findalldevs(&nics, buffer_error) ==
-1)<BR> {<BR> printf("Error en la captura de NICs: %s\n",
buffer_error);<BR> exit(1);<BR> }</P>
<P> printf("\nLas NICs encontradas son:\n\n");</P>
<P> for(i=0,d=nics; d; d=d->next,++i) /* Imprime la información de las
NICs detectadas*/<BR> describe(d,i+1);</P>
<P> if(i==0)<BR> {<BR> puts("\nNo se encontraron NICs!
Verifica que Winpcap este
instalado...");<BR> exit(1);<BR> }</P>
<P> while(1)<BR> {<BR>
printf("\nIngrese el numero de interface de la cual desea capturar los
paquetes (1-%d): ",i);<BR> scanf("%d", &id_nic);</P>
<P> if(id_nic < 1 || id_nic >
i)<BR> puts("El numero de interface esta
fuera del rango.");</P>
<P> else<BR>
break;<BR> }<BR>}</P>
<P><BR>void captura_y_almacena_paquetes()<BR>{<BR> struct
pcap_pkthdr *cabecera;<BR> struct tm
*tiempo_cabecera,*tiempo;<BR> struct bpf_program
codigo_filtro;<BR> const u_char
*paquete;<BR> pcap_t *descriptor; <BR>
u_int mascara_de_red;<BR> char
timestr[16],filtro[20]="ip",nombre[30]="paquetes.txt";<BR>
int i,num_paquete,res;<BR> int
*puntero;<BR> FILE *buffer;</P>
<P> for(d=nics, i=0; i< id_nic-1 ;d=d->next, i++); /*
Ubico la NIC deseada */</P>
<P> /* Abro el dispositivo de red y su adaptador*/<BR> <BR> if
((descriptor= pcap_open_live(d->name, /* nombre de la NIC
*/<BR>
65536, /* garantiza que capturo el paquete
completo*/<BR>
1, /* modo promiscuo (un valor
diferente de cero) */ <BR>
1000, /* timeout
*/<BR> buffer_error /*
almacena los posibles errores */<BR>
)) == NULL)<BR> {<BR> printf("\nNo se puede abrir el adaptador
porque %s no es soportado por WinPcap\n", d->name);
<BR> pcap_freealldevs(nics); /* Libero la lista de NICs
*/<BR> exit(1);<BR> }<BR> <BR> mascara_de_red=((struct
sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;</P>
<P> /* Compilo el filtro */<BR> if
(pcap_compile(descriptor,&codigo_filtro,filtro,1,mascara_de_red) <0
)<BR> {<BR> printf("\nNo se puede compilar el
filtro.\n");<BR> pcap_freealldevs(nics);
<BR> exit(1);<BR> }</P>
<P> /* Aplico el filtro */<BR> if
(pcap_setfilter(descriptor,&codigo_filtro)<0)<BR> {<BR> printf("\nError
aplicando el
filtro.\n");<BR> pcap_freealldevs(nics);
<BR> exit(1);<BR> }<BR> <BR>
printf("Ingrese el numero maximo de paquetes a capturar: ");
<BR> scanf("%d",&cantidad_paquetes);<BR> system("pause");<BR>
system("cls");<BR> printf("\nCapturando paquetes de
%s...\n\n", d->description);</P>
<P> <BR>
buffer=fopen(nombre,"w"); /* Abro el buffer de almacenamiento de
los paquetes */<BR>
pcap_freealldevs(nics); /* Libero la lista de NICs
porque ya no la necesito */</P>
<P> for(num_paquete=1;num_paquete<=cantidad_paquetes
&& (res = pcap_next_ex(descriptor, &cabecera, &paquete)) >=
0;++num_paquete)<BR> {<BR> if(res == 0) /* Pasó timeout
*/<BR> {<BR> /*fprintf(buffer,"Pasando de la zona
de Kernel a la de usuario...\n\n");*/ <BR> --num_paquete; /*
No incrementa la cuenta si no se ha capturado algun paquete
*/<BR>
continue;<BR> }</P>
<P> /*
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<BR> DEBO
HALLAR EL TIEMPO CON PRECISIÓN DE MILISEGUNDOS
*/<BR>
<BR>
retardo[num_paquete]=(num_paquete*239)%129;<BR>
/*
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</*
<BR>
<BR>
<BR> /* convierte el timestamp a un
formato entendible */<BR>
tiempo_cabecera=localtime(&cabecera->ts.tv_sec);<BR>
strftime( timestr, sizeof timestr, "%H:%M:%S", tiempo_cabecera);
<BR>
<BR> /*Imprimo el número de paquete
y su marca de tiempo*/<BR>
fprintf(buffer,"%d
%s.%.6d\n",num_paquete,timestr,cabecera->ts.tv_usec);<BR>
<BR> /*Se imprime el timestamp con
precision de microsegundos*/ <BR>/*
fprintf(buffer,"Paquete #%d capturado a las %s.%.6d de %d bytes de longitud
\n\n", num_paquete, timestr, cabecera->ts.tv_usec, cabecera->len);*/</P>
<P> for (i=1; i <= cabecera->caplen ; i++) /*Imprimo el
paquete*/<BR> {<BR> fprintf(buffer,"%02X ",
paquete[i-1]);<BR> if ( (i & 15) == 0)
fprintf(buffer,"\n");<BR> }</P>
<P> fprintf(buffer,"100\n\n\n"); /* el 100 sirve como delimitador
de paquete */<BR> }</P>
<P> puts("al menos llegas");<BR>
pcap_stats_ex(descriptor,estadisticas);<BR> puts("y
aca?");<BR> pcap_close(descriptor);<BR>
fclose(buffer);<BR>}</P>
<P><BR>void interpreta_paquetes()<BR>{<BR> char
entrada[30]="paquetes.txt",salida[30]="resultados.txt";<BR>
FILE *buffer,*res;<BR> char
tiempo[50],c,temp[50];<BR> int
flag=0,num_paquete,aux,i,byte[65536];
/* variables auxiliares */ <BR> int
proto,ldatos,lip,servicio,lpaquete,lcabecera; /* caracteristicas del
paquete */</P>
<P> buffer=fopen(entrada,"r");<BR>
res=fopen(salida,"w");<BR> <BR>
while(fscanf(buffer,"%d
%s\n",&num_paquete,tiempo)==2)<BR>
{<BR> /* lectura del paquete
almacenado en el buffer */ <BR>
for(i=0;fscanf(buffer,"%X",&aux)==1 &&
aux!=256;++i)<BR>
byte[i]=aux;<BR>
<BR>
lpaquete=i;<BR> fprintf(res,"Paquete
%d recibido a las %s de longitud %d:\n\n",num_paquete,tiempo,lpaquete);
<BR> fprintf(res,"MAC de destino:
%02X-%02X-%02X-%02X-%02X-%02X\n",byte[0],byte[1],byte[2],byte[3],byte[4],byte[5]);<BR>
fprintf(res,"MAC de origen :
%02X-%02X-%02X-%02X-%02X-%02X\n",byte[6],byte[7],byte[8],byte[9],byte[10],byte[11]);
<BR> <BR>/* Si el campo
Type=0x0800=2048 se trata de un paquete IP
*/<BR>
if(byte[12]*256+byte[13]!=2048)<BR>
{<BR>
flag=1;<BR>
continue;<BR>
}<BR>
<BR>
fprintf(res,"IPv%d\n",byte[14]/16);
<BR>
lcabecera=(byte[14]%16)*4;<BR>
fprintf(res,"Longitud de la cabecera: %d
bytes\n",lcabecera);<BR>
servicio=byte[15]; /* Aquí falta una tabla
*/<BR>
lip=byte[16]*16+byte[17];<BR>
fprintf(res,"Longitud total: %d bytes\n",lip);
<BR>
ldatos=lip-lcabecera;<BR>
proto=byte[23];<BR>
<BR>
switch(proto)<BR>
{<BR> case
1: fprintf(res,"Protocolo
ICMP\n");<BR>
break;<BR>
<BR> case
2: fprintf(res,"Protocolo
IGMP\n");<BR>
break;</P>
<P> case
4: fprintf(res,"Protocolo
IP\n");<BR>
break;<BR>
<BR> case
6: fprintf(res,"Protocolo
TCP\n");<BR>
break; </P>
<P> case
17: fprintf(res,"Protocolo
UDP\n");<BR>
break;</P>
<P> case
41: fprintf(res,"Protocolo
IPv6\n");<BR>
break;<BR>
<BR> case
46: fprintf(res,"Protocolo
RSVP\n");<BR>
break;
<BR>
<BR> case
58: fprintf(res,"Protocolo
ICMPv6\n");<BR>
break;</P>
<P> case
89: fprintf(res,"Protocolo
OSPF\n");<BR>
break;<BR>
<BR>
default: fprintf(res,"Otro
protocolo\n");<BR>
}<BR>
<BR> fprintf(res,"Direccion IP de
origen :
%d.%d.%d.%d\n",byte[26],byte[27],byte[28],byte[29]);<BR>
fprintf(res,"Direccion IP de destino:
%d.%d.%d.%d\n",byte[30],byte[31],byte[32],byte[33]);
<BR> fprintf(res,"Puerto de origen :
%d\n",byte[34]*256+byte[35]);<BR>
fprintf(res,"Puerto de destino:
%d\n",byte[36]*256+byte[37]);<BR>
<BR>
fprintf(res,"\n\n");<BR> }<BR>
<BR> if(flag==1) fprintf(res,"El filtro no
funciona!!!");<BR> fclose(buffer);<BR>
fclose(res);<BR>}</P>
<P><BR><BR>int main()<BR>{<BR>
reconoce_nics_y_elige_una();<BR> puts("ya
elegiste");<BR>
captura_y_almacena_paquetes();<BR> puts("ya
almacenaste");<BR>
interpreta_paquetes();<BR> return 0; <BR>}</P>
<P> </P>
<P>Please help me. I need some statistics about packets.</P>
<P>Best regards.</P></DIV>
<DIV> </DIV>
<P>
<HR>
<P></P>_______________________________________________<BR>Winpcap-users
mailing
list<BR>Winpcap-users@winpcap.org<BR>https://www.winpcap.org/mailman/listinfo/winpcap-users<BR></BLOCKQUOTE></BODY></HTML>