Recolher dados de uma interface de rede em linux

jae686

Power Member
Bom dia. Pretendo escrever uma ferramenta em C que me permita, em linux, a obtenção de varios dados sobre o trafego que percorre uma dada interface de rede (tx, rx, MAC, uptime da interface, etc).

Alguma sugestão sobre como o fazer da forma mais eficiente e com pouca overhead ?

Cumprimentos
 
Boas,

Eu nunca fiz nada de semelhante, mas acho que podes utilizar o protocolo snmp para fazeres uma "query" ao interface. O C tem a função system("some command"); que te permite enviar comandos ao sistema operativo, podes usar esta função para enviar pedidos snmp.
 
Olá.

Consulta o ficheiro /proc/net/dev, podes fazer um parser simples para retirar parte da informação que precisas.

Código para veres o MAC address, retirado daqui:

Código:
#include <stdio.h>

#include <string.h> /* for strncpy */

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>

int
main()
{
 int fd;
 struct ifreq ifr;

 fd = socket(AF_INET, SOCK_DGRAM, 0);

 ifr.ifr_addr.sa_family = AF_INET;
 strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);

 ioctl(fd, SIOCGIFHWADDR, &ifr);

 close(fd);

 /* display result */
 printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
         (unsigned char)ifr.ifr_hwaddr.sa_data[0],
         (unsigned char)ifr.ifr_hwaddr.sa_data[1],
         (unsigned char)ifr.ifr_hwaddr.sa_data[2],
         (unsigned char)ifr.ifr_hwaddr.sa_data[3],
         (unsigned char)ifr.ifr_hwaddr.sa_data[4],
         (unsigned char)ifr.ifr_hwaddr.sa_data[5]);

 return 0;
}

Deixo, também, o código das net-tools que incluem, entre outras ferramentas, o famoso ifconfig: http://www.tazenda.demon.co.uk/phil/net-tools/net-tools-1.60.tar.bz2.

Cumps,
JP
 
Já exploraste a biblioteca pcap?
Código:
$ man pcap
NAME
       pcap - Packet Capture library

SYNOPSIS
       #include <pcap.h>

       char errbuf[PCAP_ERRBUF_SIZE];
......
DESCRIPTION
       The  Packet  Capture  library provides a high level interface to packet capture systems. All packets on the network, even those destined
       for other hosts, are accessible through this mechanism.
.......
 
Muito Obrigado pelas respostas!

Vou estudar as opçoes e irei mostrar o progresso a medida que este surgir.

P.S. Nao fazia ideia que existia uma lib so para isso!

Thx!
:D
 
Back
Topo