Avatar billede esf_spike Nybegynder
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
Avatar billede kamikaze Nybegynder
10. august 2002 - 23:28 #1
lytter... :o)
Avatar billede krukken Juniormester
18. august 2002 - 20:09 #2
Du kan jo downloade et program hos Download.com! Jeg vil godt finde et link til programmet! Men vil du selv programmere det, eller er det nok med det program?!
Avatar billede esf_spike Nybegynder
18. august 2002 - 20:22 #3
Forstå nu krukken.. gruppen er C/C++, jeg skal bruge noget sourcecode.
Avatar billede krukken Juniormester
18. august 2002 - 20:23 #4
Godt så! Jeg skulle bare lige være sikker!
Avatar billede reficul Nybegynder
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
}
Avatar billede reficul Nybegynder
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;
}
Avatar billede reficul Nybegynder
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
Avatar billede reficul Nybegynder
26. august 2002 - 02:25 #8
Der er i hvert fald noget at gå ud fra...
Avatar billede esf_spike Nybegynder
26. august 2002 - 17:35 #9
Jeg kan ik helt få det til at virke
Er det sådan du kan lægge en eventuel Visual C++ project zippet ned op et sted?
Ville være meget rart
Får du 50 extra point for ;)

-Jesper
Avatar billede reficul Nybegynder
26. august 2002 - 17:53 #10
http://ungod.developers.dk/netload.zip

Kan desuden compiles i linux med "gcc -O2 -o netload netload.cpp devinfo.cpp"
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester