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 Novataris
Vejen til devops med Bavarian Nordic
Bavarian Nordics vækst blev starten på et DevOps-samarbejde med Novataris for hurtigt at kunne tilpasse IT-organisation til forretningen.
7. december 2023
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