webForumDet fria alternativet

C - Nätverks statistik program

Programmeringur Script - Övrigt

0 svar · 5 692 visningar · startad av Viktor

Medlem sedan aug. 20021 752 inlägg
Frågan#1

Bara för Linux/Unix. Testat på Redhat 7.3 och Coyote Linux 2.10

Räknaren som finns i filen /proc/net/dev ställs om till 0 när man har fört över mer än 4294967296 bytes och med dagens bredband är vi nog flera som gör det :)
Vad detta program gör är att det sparar undan värdet för räknaren och nästa gång programmet startar så jämför den och ser om räknaren är mindre eller mer sedan senast, är den mindre så har det skett en reset och då ökas reset räknaren.
Programmet är gjort med tanke på att det ska köras kontinueligt, t.ex. genom ett entry i crontaben.
Formatet på statistik file är

DOWN_RESETS:LAST_DOWN:UP_RESETS:LAST_UP

Så ta värdet som står i DOWN_RESETS och multiplicera det med 4294967296 och lägg till värdet som står i LAST_DOWN så får man den totala mängden nerladdad data.
Programmet tar två in parametrar, sökväg och filnamn för statistikfilen och sedan namnet på det interface som statistiken gäller, eth0, eth1, lo osv.

Själv använder jag detta program på min router och kan sedan via routerns webserver hämta statistik file för avläsning på min vanliga dator i programmet Samurize :)

/*
	vgstat - a very simple network usage calculation program.
*/

#include <string.h>
#include <stdio.h>

void trim(char *str);
int getcurrentdata(char *iface, int *down, int *up);
void loadstat(char *filename, int *down_resets, int *down_last, int *up_resets, int *up_last);
void savestat(char *filename, int down_resets, int down_last, int up_resets, int up_last);

int main(int argc, char *argv[])
{
	unsigned int up_resets=0,down_resets=0,up_last=0,down_last=0;
	unsigned int current_up=0, current_down=0;
	if(argc!=3)
	{
		printf("Usage: stat DB_FILE INTERFACE\n");
		return(-1);
	}

	if(getcurrentdata(argv[2],& current_down,& current_up)==-1)
	{
		printf("Error: Unable to open '/proc/net/dev'.\n");
		return(-1);
	}
	loadstat(argv[1],&down_resets,&down_last,&up_resets,&up_last);
	if(down_last>current_down)
		down_resets++;
	if(up_last>current_up)
		up_resets++;
	savestat(argv[1],down_resets,current_down,up_resets,current_up);
	return(0);
}

/* save stat to file */
void savestat(char *filename, int down_resets, int down_last, int up_resets, int up_last)
{
	FILE *fp=fopen(filename,"w");
	fseek(fp,0,SEEK_SET);
	fprintf(fp,"%u:%u:%u:%u",down_resets,down_last,up_resets,up_last);
	fclose(fp);
}

/* gets stat from file */
void loadstat(char *filename, int *down_resets, int *down_last, int *up_resets, int *up_last)
{
	FILE *fp;
	if((fp=fopen(filename,"r"))==NULL)
	{
		*down_resets=0;
		*up_resets=0;
		*down_last=0;
		*up_last=0;
	}
	else
	{
		fseek(fp,0,SEEK_SET);
		fscanf(fp,"%u:%u:%u:%u",down_resets,down_last,up_resets,up_last);
		fclose(fp);
	}
}

/* get up/down statistics from /proc/net/dev */
int getcurrentdata(char *iface, int *down, int *up)
{
	char data[255];
	char *tmp;
	FILE *fp;

	if((fp=fopen("/proc/net/dev","r"))==NULL)
		return(-1);
	while((fgets(data,255,fp))!=NULL)
	{
		trim(data);
		if(!strncmp(data,iface,strlen(iface)))
		{
			tmp=strchr(data,':');
			tmp++;
			sscanf(tmp,"%u %*u %*u %*u %*u %*u %*u %*u %u",down,up);
		}
	}
	fclose(fp);
	return(0);
}

/* Trim unwanted space and tab at the start and end of the string */
void trim(char *str)
{
	int pos=0;
	int offset=0;
	int len=strlen(str);
	pos=0;
	while(((str[pos]=='\t')||(str[pos]==' ')||(str[pos]=='\n'))&&(pos<len))
		pos++;
	offset=pos;
	while(((str[--len]=='\t')||(str[len]==' ')||(str[len]=='\n'))&&(len>0));
	while(pos<len+1)
		str[pos-offset]=str[pos++];
	str[pos-offset]='\0';
}

/Viktor

128 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)