10. august 2002 - 17:31
Der er
8 kommentarer og
2 løsninger
Båndbredde
Hej, jeg vil gerne vide hvordan jeg kan læse den nuværende båndbredde-udnyttelse ligesom DU-meter gør. F.eks at den viser at jeg bruger 25 kb/s på at downloade og 10 kb/s opad. Skulle da ikke være så svært?
Helst ingen dødsyge referencer, fordi jeg HAR ledt på google og msdn. Virkende kode, tak! :)
-Jesper
26. august 2002 - 02:22
#5
Her er noget kode, jeg engang lavede til Windows XP/linux konsol med selvsamme formål. Koden udnytter kommandoen "netstat -e", der viser total uploadet og downloadet - ved så at læse med et vis interval har man en hastighed! Hvis du blot ser bort fra koden imellem "#if defined(linux)" og "#else", så har du et Win32 konsol-program!
#include <stdio.h>
#include <string.h>
#if defined(linux)
#include <unistd.h>
#elif defined(WIN32)
#include "windows.h"
#endif
#include "devinfo.h"
int getdevinfo (const char *device, devinfopack_t *devinfo) {
if (device == NULL || devinfo == NULL || *device == 0)
return -1;
#if defined (linux)
FILE *file;
file = fopen("/proc/net/dev", "r");
if (file == NULL)
return -1;
char buffer[512];
bool found;
int length;
length = strlen(device);
found = false;
while (!ferror(file) && !feof(file)) {
if (fgets(buffer, sizeof(buffer), file)) {
char *ptr;
ptr = strstr(buffer, device);
if (ptr && ptr[length] == ':') {
sscanf(&ptr[length+1], "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
&devinfo->recv.bytes,
&devinfo->recv.packets,
&devinfo->recv.errs,
&devinfo->recv.drop,
&devinfo->recv.fifo,
&devinfo->recv.frame,
&devinfo->recv.compressed,
&devinfo->recv.multicast,
&devinfo->send.bytes,
&devinfo->send.packets,
&devinfo->send.errs,
&devinfo->send.drop,
&devinfo->send.fifo,
&devinfo->send.frame,
&devinfo->send.compressed,
&devinfo->send.multicast);
found = true;
break;
}
}
}
fclose(file);
if (found)
return 0;
else
return -1;
#elif defined(WIN32)
FILE *file;
file = _popen("netstat -e", "r");
if (file == NULL)
return -1;
char buffer[128];
int section;
section = 0;
while (!ferror(file) && !feof(file)) {
if (fgets(buffer, sizeof(buffer), file)) {
if (strlen(buffer)) {
switch (buffer[0]) {
case 'B':
sscanf(&buffer[6], "%lu %lu", &devinfo->recv.bytes, &devinfo->send.bytes);
break;
case 'U':
if (buffer[2] == 'i')
sscanf(&buffer[16], "%lu %lu", &devinfo->recv.packets, &devinfo->send.packets);
else
section++;
break;
case 'N':
sscanf(&buffer[20], "%lu %lu", &devinfo->recv.multicast, &devinfo->send.multicast);
break;
case 'D':
sscanf(&buffer[9], "%lu, %lu", &devinfo->recv.drop, &devinfo->send.drop);
break;
case 'E':
sscanf(&buffer[7], "%lu %lu", &devinfo->recv.errs, &devinfo->send.errs);
break;
}
}
}
}
_pclose(file);
devinfo->recv.packets+=devinfo->recv.multicast;
devinfo->send.packets+=devinfo->send.multicast;
devinfo->recv.compressed = 0;
devinfo->send.compressed = 0;
devinfo->recv.fifo = 0;
devinfo->send.fifo = 0;
devinfo->recv.frame = 0;
devinfo->send.frame = 0;
return 0;
#endif
}
double measure_speed (const char *device, devinfopack_t *devinfo, INFO_T *part, unsigned long interval) {
if (device == NULL || devinfo == NULL || (unsigned long)part < (unsigned long)devinfo || (unsigned long)part > (unsigned long)devinfo + sizeof(*devinfo) || ((unsigned long)part - (unsigned long)devinfo) % sizeof(devinfo->recv.bytes) != 0 || interval == 0)
return -1;
INFO_T a, b;
if (getdevinfo(device, devinfo) == -1)
return -1;
a = *part;
sleep(interval);
if (getdevinfo(device, devinfo) == -1)
return -1;
b = *part;
#if defined(linux)
return (b - a) / (double)interval;
#elif defined(WIN32)
double c, d;
c = (double)a;
d = (double)b;
return (d - c) / (double)interval;
#endif
}
26. august 2002 - 02:23
#6
Voups - manglede lige en fil mere (Den med main) :D
#include <stdio.h>
#include "devinfo.h"
int main () {
devinfopack_t devinfo;
printf("Speed: %f bytes/sec\n", (float)measure_speed("eth0", &devinfo, &devinfo.recv.bytes, 10));
return 0;
}
26. august 2002 - 02:24
#7
Jeg har for travlt, tror jeg. Den første fil kaldte jeg devinfo.cpp og den næste netload.cpp. Her er to include-filer:
devinfo.h:
#ifndef _INCLUDE_DEVINFO_H_
#define _INCLUDE_DEVINFO_H_
#if defined(linux)
#define INFO_T float
#elif defined(WIN32)
#define INFO_T unsigned long
#endif
typedef struct devinfo_s {
INFO_T bytes;
INFO_T packets;
INFO_T errs;
INFO_T drop;
INFO_T fifo;
INFO_T frame;
INFO_T compressed;
INFO_T multicast;
} devinfo_t;
typedef struct devinfopack_s {
devinfo_t recv;
devinfo_t send;
} devinfopack_t;
int getdevinfo (const char *device, devinfopack_t *devinfo);
double measure_speed (const char *device, devinfopack_t *devinfo, INFO_T *part, unsigned long interval);
#endif
windows.h:
#ifndef _INCLUDE_DEVINFO_H_
#define _INCLUDE_DEVINFO_H_
#if defined(linux)
#define INFO_T float
#elif defined(WIN32)
#define INFO_T unsigned long
#endif
typedef struct devinfo_s {
INFO_T bytes;
INFO_T packets;
INFO_T errs;
INFO_T drop;
INFO_T fifo;
INFO_T frame;
INFO_T compressed;
INFO_T multicast;
} devinfo_t;
typedef struct devinfopack_s {
devinfo_t recv;
devinfo_t send;
} devinfopack_t;
int getdevinfo (const char *device, devinfopack_t *devinfo);
double measure_speed (const char *device, devinfopack_t *devinfo, INFO_T *part, unsigned long interval);
#endif