ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/examples/network_traffic.c
Revision: 1.9
Committed: Sat Mar 6 22:37:27 2004 UTC (20 years, 2 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.8: +36 -16 lines
Log Message:
Update network traffic example to make it aware of new data.

File Contents

# User Rev Content
1 pajs 1.1 /*
2     * i-scream central monitoring system
3 tdb 1.3 * http://www.i-scream.org
4 tdb 1.7 * Copyright (C) 2000-2004 i-scream
5 pajs 1.1 *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU General Public License
8     * as published by the Free Software Foundation; either version 2
9     * of the License, or (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 tdb 1.8 *
20 tdb 1.9 * $Id: network_traffic.c,v 1.8 2004/01/19 16:49:19 tdb Exp $
21 pajs 1.1 */
22    
23     /* A very basic example of how to get the network statistics from the system
24     * and diaply them. Also it adds up all the traffic to create and print out
25     * a total
26     * Takes several arguments :
27     * -d <number> Takes the number of seconds to wait to get traffic sent since last call
28 tdb 1.5 * Note, this is not network traffic per second. Its the traffic since last
29     * call. If you want it traffic per second averaged over time since last call
30 pajs 1.1 * You need to divide against the time since last time this was called. The time
31     * between 2 calls is stored in systime in the network_stat_t structure.
32     * -b Display in bytes
33     * -k Display in kilobytes
34 tdb 1.5 * -m Display in megabytes
35 pajs 1.1 */
36    
37     #include <stdio.h>
38     #include <statgrab.h>
39     #include <stdlib.h>
40     #include <unistd.h>
41    
42     int main(int argc, char **argv){
43    
44     extern char *optarg;
45     extern int optind;
46     int c;
47    
48     /* We default to 1 second updates and displaying in bytes*/
49     int delay = 1;
50     char units = 'b';
51    
52     network_stat_t *network_stats;
53     int num_network_stats;
54    
55     /* Parse command line options */
56 ats 1.4 while ((c = getopt(argc, argv, "d:bkm")) != -1){
57 pajs 1.1 switch (c){
58     case 'd':
59     delay = atoi(optarg);
60     break;
61     case 'b':
62     units = 'b';
63     break;
64     case 'k':
65     units = 'k';
66     break;
67     case 'm':
68     units = 'm';
69     break;
70     }
71     }
72    
73 tdb 1.5 /* Initialise statgrab */
74     statgrab_init();
75    
76 ats 1.6 /* Drop setuid/setgid privileges. */
77     if (statgrab_drop_privileges() != 0) {
78     perror("Error. Failed to drop privileges");
79     return 1;
80     }
81    
82 tdb 1.5 /* We are not interested in the amount of traffic ever transmitted, just differences.
83 pajs 1.1 * Because of this, we do nothing for the very first call.
84     */
85 tdb 1.5
86 pajs 1.1 network_stats = get_network_stats_diff(&num_network_stats);
87     if (network_stats == NULL){
88     perror("Error. Failed to get network stats");
89     return 1;
90     }
91    
92     /* Clear the screen ready for display the network stats */
93     printf("\033[2J");
94 tdb 1.5
95 pajs 1.1 /* Keep getting the network stats */
96     while ( (network_stats = get_network_stats_diff(&num_network_stats)) != NULL){
97     int x;
98     int line_number = 2;
99    
100     long long total_tx=0;
101     long long total_rx=0;
102 tdb 1.9 long long total_ipackets=0;
103     long long total_opackets=0;
104     long long total_ierrors=0;
105     long long total_oerrors=0;
106     long long total_collisions=0;
107 pajs 1.1
108     for(x = 0; x < num_network_stats; x++){
109     /* Print at location 2, linenumber the interface name */
110 tdb 1.9 printf("\033[%d;2H%-30s : %-10s", line_number++, "Network Interface Name", network_stats->interface_name);
111 pajs 1.1 /* Print out at the correct location the traffic in the requsted units passed at command time */
112     switch(units){
113     case 'b':
114 tdb 1.9 printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Interface Rx", network_stats->rx);
115     printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Interface Tx", network_stats->tx);
116 pajs 1.1 break;
117     case 'k':
118 tdb 1.9 printf("\033[%d;2H%-30s : %5lld k", line_number++, "Network Interface Rx", (network_stats->rx / 1024));
119     printf("\033[%d;2H%-30s : %5lld", line_number++, "Network Interface Tx", (network_stats->tx / 1024));
120 tdb 1.5 break;
121 pajs 1.1 case 'm':
122 tdb 1.9 printf("\033[%d;2H%-30s : %5.2f m", line_number++, "Network Interface Rx", network_stats->rx / (1024.00*1024.00));
123     printf("\033[%d;2H%-30s : %5.2f m", line_number++, "Network Interface Tx", network_stats->tx / (1024.00*1024.00));
124 pajs 1.1 }
125 tdb 1.9 printf("\033[%d;2H%-30s : %ld ", line_number++, "Network Interface packets in", network_stats->ipackets);
126     printf("\033[%d;2H%-30s : %ld ", line_number++, "Network Interface packets out", network_stats->opackets);
127     printf("\033[%d;2H%-30s : %ld ", line_number++, "Network Interface errors in", network_stats->ierrors);
128     printf("\033[%d;2H%-30s : %ld ", line_number++, "Network Interface errors out", network_stats->oerrors);
129     printf("\033[%d;2H%-30s : %ld ", line_number++, "Network Interface collisions", network_stats->collisions);
130     printf("\033[%d;2H%-30s : %ld ", line_number++, "Network Interface systime", (long) network_stats->systime);
131 tdb 1.5
132 pajs 1.1 /* Add a blank line between interfaces */
133     line_number++;
134    
135     /* Add up this interface to the total so we can display a "total" network io" */
136     total_tx+=network_stats->tx;
137     total_rx+=network_stats->rx;
138 tdb 1.9 total_ipackets+=network_stats->ipackets;
139     total_opackets+=network_stats->opackets;
140     total_ierrors+=network_stats->ierrors;
141     total_oerrors+=network_stats->oerrors;
142     total_collisions+=network_stats->collisions;
143 pajs 1.1
144     /* Move the pointer onto the next interface. Since this returns a static buffer, we dont need
145     * to keep track of the orginal pointer to free later */
146     network_stats++;
147     }
148 tdb 1.5
149 tdb 1.9 printf("\033[%d;2H%-30s : %-10s", line_number++, "Network Interface Name", "Total Network IO");
150 pajs 1.1 switch(units){
151     case 'b':
152 tdb 1.9 printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Total Rx", total_rx);
153     printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Total Tx", total_tx);
154 pajs 1.1 break;
155     case 'k':
156 tdb 1.9 printf("\033[%d;2H%-30s : %5lld k", line_number++, "Network Total Rx", (total_rx / 1024));
157     printf("\033[%d;2H%-30s : %5lld k", line_number++, "Network Total Tx", (total_tx / 1024));
158 pajs 1.1 break;
159     case 'm':
160 tdb 1.9 printf("\033[%d;2H%-30s : %5.2f m", line_number++, "Network Total Rx", (total_rx / (1024.00*1024.00)));
161     printf("\033[%d;2H%-30s : %5.2f m", line_number++, "Network Total Tx", (total_tx / (1024.00*1024.00)));
162 pajs 1.1 break;
163     }
164 tdb 1.9 printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Total packets in", total_ipackets);
165     printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Total packets out", total_opackets);
166     printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Total errors in", total_ierrors);
167     printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Total errors out", total_oerrors);
168     printf("\033[%d;2H%-30s : %8lld b", line_number++, "Network Total collisions", total_collisions);
169 tdb 1.5
170 pajs 1.1 fflush(stdout);
171    
172     sleep(delay);
173    
174     }
175    
176     return 0;
177    
178     }