#include #include #include #include #include #include #include #define STRING1 "RX bytes:" #define STRING2 "TX bytes:" //#define DEVICE "eth0" //#define DEVICE "ppp0" //#define DEVICE "wlan0" #define DEVICE "wlan5" #define CAPTURE_PATH "bandwidth.cap" #define MAX_CAPTURE 0x100000 * 2 #define USECOND_INTERVAL 1000000 char *device = DEVICE; unsigned char *capture_buffer = 0; int capture_allocated = 0; int capture_size = 0; struct timeval current_time; struct timeval new_time; void capture_text(char *text) { if(capture_size > MAX_CAPTURE) return; int len = strlen(text); if(capture_size + len > capture_allocated) { capture_buffer = realloc(capture_buffer, capture_size + len); capture_allocated = capture_size + len; } memcpy(capture_buffer + capture_size, text, len); capture_size += len; } void signal_handler(int signum) { FILE *out = fopen(CAPTURE_PATH, "w"); fwrite(capture_buffer, capture_size, 1, out); fclose(out); abort(); } int main(int argc, char *argv[]) { unsigned char *buffer = (unsigned char*)calloc(1, 0x1000); int64_t rx_bytes; int64_t tx_bytes; int64_t prev_rx_bytes = 0; int64_t prev_tx_bytes = 0; int use_bytes = 1; int use_table = 0; int i; if(argc > 1) { for(i = 1; i < argc; i++) { if(!strcmp(argv[i], "-b")) use_bytes = 0; else if(!strcmp(argv[i], "-t")) use_table = 1; else device = argv[i]; } } signal(SIGINT, signal_handler); while(1) { char string[1024]; sprintf(string, "ifconfig %s", device); FILE *fd = popen(string, "r"); if(!fd) { perror("fopen"); exit(1); } bzero(buffer, 0x1000); int bytes = fread(buffer, 1, 0x1000, fd); fclose(fd); // Get RX bytes char *ptr = strstr((const char*)buffer, STRING1); if(ptr) { ptr += strlen(STRING1); sscanf(ptr, "%lld", &rx_bytes); } ptr = strstr((const char*)buffer, STRING2); if(ptr) { ptr += strlen(STRING2); sscanf(ptr, "%lld", &tx_bytes); } if(!prev_rx_bytes) prev_rx_bytes = rx_bytes; if(!prev_tx_bytes) prev_tx_bytes = tx_bytes; // if(rx_bytes != prev_rx_bytes || tx_bytes != prev_tx_bytes) gettimeofday(&new_time, 0); double seconds_elapsed = (double)(new_time.tv_usec - current_time.tv_usec) / 1000000 + (new_time.tv_sec - current_time.tv_sec); current_time = new_time; if(seconds_elapsed > 0.01) { char string[1024]; if(use_table) { sprintf(string, "%.1f\t%.1f\n", (double)(rx_bytes - prev_rx_bytes) * 8 / seconds_elapsed, (double)(tx_bytes - prev_tx_bytes) * 8 / seconds_elapsed); } else if(use_bytes) { sprintf(string, "Incoming: %.1f/%.1f Outgoing: %.1f/%.1f\n", (double)(rx_bytes - prev_rx_bytes) * 8 / seconds_elapsed, (float)(rx_bytes - prev_rx_bytes) / seconds_elapsed / 1024, (double)(tx_bytes - prev_tx_bytes) * 8 / seconds_elapsed, (float)(tx_bytes - prev_tx_bytes) / seconds_elapsed / 1024); } else { sprintf(string, "Incoming: %lld (%.1f bits/sec) Outgoing: %lld (%.1f bits/sec) \n", rx_bytes, (double)(rx_bytes - prev_rx_bytes) * 8 / seconds_elapsed, tx_bytes, (double)(tx_bytes - prev_tx_bytes) * 8 / seconds_elapsed); } printf("%s", string); capture_text(string); fflush(stdout); prev_rx_bytes = rx_bytes; prev_tx_bytes = tx_bytes; seconds_elapsed = 0; } usleep(USECOND_INTERVAL); seconds_elapsed += (double)USECOND_INTERVAL / 1000000; } }