12#include <sys/sysctl.h>
13#include <sys/socket.h>
17#include "networksensor.h"
19NetworkSensor::NetworkSensor( TQString dev,
int interval ):Sensor( interval )
28 sysctlbyname(
"net.link.generic.system.ifcount", &n, &nlen, NULL, 0);
31 if_miblen =
sizeof(if_mib);
32 static int name[] = { CTL_NET,
47 for (
int i = 1; i <= n; ++i) {
50 sysctl(name, 6, (
void*)&if_mib, (
size_t*)&if_miblen, (
void*)NULL, (
size_t)0);
53 if (TQString(if_mib.ifmd_name) == device) {
59 if ( if_mib.ifmd_flags & RTF_GATEWAY )
63 if ((if_number == -1) && (if_gw != -1))
66 if( device.isEmpty() )
69 getInOutBytes(receivedBytes,transmittedBytes);
73NetworkSensor::~NetworkSensor()
76void NetworkSensor::getInOutBytes (
unsigned long &in,
unsigned long &out)
const
79 if (if_number != -1) {
81 if_miblen =
sizeof(if_mib);
82 int name[] = { CTL_NET,
89 sysctl(name, 6, (
void*)&if_mib, (
size_t*)&if_miblen, (
void*)NULL, (
size_t)0);
91 in = if_mib.ifmd_data.ifi_ibytes;
92 out = if_mib.ifmd_data.ifi_obytes;
99 TQFile file(
"/proc/net/dev");
101 if ( file.open(IO_ReadOnly | IO_Translate) )
103 TQTextStream t( &file );
105 while(line !=0 && !line.contains(device))
109 if ( line.contains( device ) )
111 TQRegExp rx(
"^\\W*"+device+
":\\D*(\\d+)(?:\\D+\\d+){7}\\D+(\\d+)",
false);
113 in = rx.cap(1).toULong();
114 out = rx.cap(2).toULong();
118 tqDebug(
"Network sensor: can not find %s", device.ascii());
127void NetworkSensor::update()
131 TQObjectListIt it( *objList );
135 unsigned long inB, outB;
136 const double delay = (double) netTimer.elapsed();
137 getInOutBytes( inB, outB );
143 meter = sp->getMeter();
144 format = sp->getParam(
"FORMAT" );
145 decimals = ( sp->getParam(
"DECIMALS" ) ).toInt();
146 if (format.length() == 0 )
151 format.replace( TQRegExp(
"%inkb",
false), TQString::number( ((inB - receivedBytes)*8)/delay,
'f', decimals ) );
152 format.replace( TQRegExp(
"%in",
false), TQString::number( (inB - receivedBytes)/delay,
'f', decimals ) );
154 format.replace( TQRegExp(
"%outkb",
false), TQString::number( ((outB - transmittedBytes)*8)/delay,
'f', decimals ) );
155 format.replace( TQRegExp(
"%out",
false), TQString::number( (outB - transmittedBytes)/delay,
'f', decimals ) );
157 meter->setValue( format );
161 transmittedBytes = outB;
164#include "networksensor.moc"