ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/examples/network_traffic.c
Revision: 1.11
Committed: Mon Mar 8 12:30:08 2004 UTC (20 years, 8 months ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_9
Changes since 1.10: +6 -6 lines
Log Message:
The values are long long, not long.

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2004 i-scream
5 *
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 *
20 * $Id: network_traffic.c,v 1.10 2004/03/08 11:58:20 tdb Exp $
21 */
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 * 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 * 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 * -m Display in megabytes
35 */
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 while ((c = getopt(argc, argv, "d:bkm")) != -1){
57 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 /* Initialise statgrab */
74 statgrab_init();
75
76 /* Drop setuid/setgid privileges. */
77 if (statgrab_drop_privileges() != 0) {
78 perror("Error. Failed to drop privileges");
79 return 1;
80 }
81
82 /* We are not interested in the amount of traffic ever transmitted, just differences.
83 * Because of this, we do nothing for the very first call.
84 */
85
86 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
95 /* 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 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
108 for(x = 0; x < num_network_stats; x++){
109 /* Print at location 2, linenumber the interface name */
110 printf("\033[%d;2H%-30s : %-10s", line_number++, "Network Interface Name", network_stats->interface_name);
111 /* Print out at the correct location the traffic in the requsted units passed at command time */
112 switch(units){
113 case 'b':
114 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 break;
117 case 'k':
118 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 break;
121 case 'm':
122 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 }
125 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Interface packets in", network_stats->ipackets);
126 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Interface packets out", network_stats->opackets);
127 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Interface errors in", network_stats->ierrors);
128 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Interface errors out", network_stats->oerrors);
129 printf("\033[%d;2H%-30s : %lld ", 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
132 /* 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 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
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
149 printf("\033[%d;2H%-30s : %-10s", line_number++, "Network Interface Name", "Total Network IO");
150 switch(units){
151 case 'b':
152 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 break;
155 case 'k':
156 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 break;
159 case 'm':
160 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 break;
163 }
164 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Total packets in", total_ipackets);
165 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Total packets out", total_opackets);
166 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Total errors in", total_ierrors);
167 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Total errors out", total_oerrors);
168 printf("\033[%d;2H%-30s : %lld ", line_number++, "Network Total collisions", total_collisions);
169
170 fflush(stdout);
171
172 sleep(delay);
173
174 }
175
176 return 0;
177
178 }