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