SNMP协议中,timestamp是指数据端服务器发送该条数据时,距离系统上次初始化的时间。
这个单位应该是10ms,发现有的软件处理这个不是很标准。
使用的是net-snmp库,里面的使用的get_uptime 正是一个返回了10ms的函数:
00569 long
00570 get_uptime( void )
00571 {
00572 long return_value = 0;
00573 DWORD buffersize = ( sizeof (PERF_DATA_BLOCK) +
00574 sizeof (PERF_OBJECT_TYPE)),
00575 type = REG_EXPAND_SZ;
00576 PPERF_DATA_BLOCK perfdata = NULL;
00577
00578 /*
00579 * min requirement is one PERF_DATA_BLOCK plus one PERF_OBJECT_TYPE
00580 */
00581 perfdata = (PPERF_DATA_BLOCK) malloc(buffersize);
00582 if (!perfdata)
00583 return 0;
00584
00585 memset(perfdata, 0, buffersize);
00586
00587 RegQueryValueEx(HKEY_PERFORMANCE_DATA,
00588 "Global" , NULL, &type, (LPBYTE) perfdata, &buffersize);
00589
00590 /*
00591 * we can not rely on the return value since there is always more so
00592 * we check the signature
00593 */
00594
00595 if (wcsncmp(perfdata->Signature, L "PERF" , 4) == 0) {
00596 /*
00597 * signature ok, and all we need is in the in the PERF_DATA_BLOCK
00598 */
00599 return_value = ( long ) ((perfdata->PerfTime100nSec.QuadPart /
00600 (LONGLONG) 100000));
00601 } else
00602 return_value = GetTickCount() / 10;
00603
00604 RegCloseKey(HKEY_PERFORMANCE_DATA);
00605 free(perfdata);
00606
00607 return return_value;
00608 }
|
可以看到在#00602 做了除以10的操作。
同样没有源代码时,可以自己简单的处理一下:
1
2
3
4
5
6
7
8
9
10
|
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
int main( int argc, char *argv[])
{
long sysuptime;
sysuptime = get_uptime();
printf ( "%ld" ,sysuptime );
return 0;
}
|
执行后得到:153852806
执行下uptime:
10:52:48 up 17 days, 19:22, 33 users, load average: 0.01, 0.08, 0.11
可以看到,系统启动了17天零19个小时
再做一个转换函数(以秒作为参数):
def getTime(seconds):
print 'day :%s' % (seconds / ( 60 * 60 * 24 ))
print 'hour :%s' % ((seconds / ( 60 * 60 )) % 24 )<br>
|
>>> getTime(153852806)
hour :16
day :1780
这样,天数相差100倍左右,则get_uptime应该是返回1s/100 = 10ms
:) 工作之余,累了就,写写博客,找点源码,看看外面的天空,
放松一下心态,程序员更要爱惜自己的身体啊