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
Annonceindlæg fra DE-CIX
Edge computing: behandling ved kilden
Edge computing revolutionerer den måde, data behandles på, ved at bringe kapacitet og ydeevne tættere på dér, hvor der er behov for det.
15. april 2025
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