Hola, soy novato así que no se si esto va aquí. Mirad mi problema. Estoy haciendo un programa en C utilizando las librerías Libpcap en linux, y quiero sacar las direcciones ip que más ancho de banda están consumiendo, por ahora llevo esto pero no se como continuar, este código que os pongo aquí lo que hace es motrar dirección de origen, dirección de destino y tamaño de todos los paquetes que se están capturando, alguno tiene idea??
Código c:
Ver original#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
#include <netinet/ether.h>
#include <netinet/ip.h>
//Funcion my_callback, sera invocada cada vez que se reciba un paquete
void my_callback(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet)
{
static int count = 0; //Esta variable sirve para contar los paquetes
count ++;
printf("Paquete: %d\n", count
);
struct ether_header *eptr;
/* Ahora extraemos la cabecera IP, por lo que tenemos
que desplazar el tamaño de la cabecera Ethernet
*/
struct ip *ipc;
ipc=packet+sizeof(struct ether_header);
printf("IP origen: %s\n",inet_ntoa
(ipc
->ip_src
)); printf("IP destino: %s\n",inet_ntoa
(ipc
->ip_dst
)); printf("Longitud del datagrama ip: \n %i\n",ipc
->ip_len
); }
int main(int argc,char **argv)
{
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
const u_char *packet;
struct pcap_pkthdr hdr;
struct ether_header *eptr; // Ethernet
bpf_u_int32 maskp; // mascara de subred
bpf_u_int32 netp; // direccion de red
dev = pcap_lookupdev(errbuf); //Buscamos un dispositivo del que comenzar la captura
if (dev == NULL)
else
{printf("Abriendo %s en modo promiscuo\n",dev
);} descr = pcap_open_live(dev,BUFSIZ,1,-1,errbuf); //comenzamos la captura en modo promiscuo
pcap_loop(descr,-1,my_callback,NULL); //entramos en el bucle (infinito)
return 0;
}
Alguien tiene idea de como se haría. Sería sacar las direcciones que más ancho de banda consumen, he intentado hacerlo mediante un array donde se guardan las direcciones IP, pero no lo consigo.
No haría falta ni que el programa se detuviera, que siguiera todo el rato funcionando, mostrando la IP que más consume, y que el usuario lo detenga pulsando Control+c