日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows下使用net-snmp实现agent扩展(三)

發(fā)布時間:2025/3/15 windows 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows下使用net-snmp实现agent扩展(三) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

時間隔得太長了,我都快忘了什么是snmp了,知識啊知識,很容易在不用的時候忘卻,也可能是自己腦袋不好使了吧?翻了翻代碼,趕緊總結(jié)下,不然真不會了……

在上篇博客中,實現(xiàn)了get/set一個字符串型變量,現(xiàn)在來實現(xiàn)對多個字符串變量的get/set。假設(shè)要實現(xiàn)獲取CPU利用率、內(nèi)存占用率和磁盤占用率的的功能,建立兩個文件:alarmInfo.h和alarmInfo.c。

在alarmInfo.h中,定義一個枚舉:

[cpp] view plaincopy print?
  • typedef?enum?tagALARMITEM??
  • {??
  • CPU_USAGE?=?1,?//在這里需要以1開始,和后面用到的結(jié)構(gòu)結(jié)合??
  • MEMORY_USAGE,??
  • DISK_USAGE,??
  • CLIENT_NUM??
  • }ALARMITEM;??
  • typedef enum tagALARMITEM { CPU_USAGE = 1, //在這里需要以1開始,和后面用到的結(jié)構(gòu)結(jié)合 MEMORY_USAGE, DISK_USAGE, CLIENT_NUM }ALARMITEM;聲明一個被main中調(diào)用的函數(shù):void init_GeneralInfo(void); //get/set命令實現(xiàn)
    聲明獲取三個值的函數(shù):
    int GetUsedCPU(); //獲得cpu利用率
    int GetUsedMemory(); //獲得內(nèi)存利用率
    int GetUsedDisk(); //獲得C盤可用空間

    alarmInfo.c中,在前面先聲明兩個函數(shù):

    [cpp] view plaincopy print?
  • //這個函數(shù)很重要,是snmp內(nèi)部處理用的函數(shù),用于驗證oid的合法性,傳遞函數(shù)指針等操作??
  • int?header_hrproc(struct?variable?*vp,??
  • oid?*?name,??
  • size_t?*?length,??
  • int?exact,?size_t?*?var_len,?WriteMethod?**?write_method);??
  • //把變量和值映射到snmp能調(diào)用的內(nèi)部結(jié)構(gòu)中??
  • u_char?*var_general_info(struct?variable?*vp,??
  • oid?*?name,??
  • size_t?*?length,??
  • int?exact,?size_t?*?var_len,?WriteMethod?**?write_method);??
  • //這個函數(shù)很重要,是snmp內(nèi)部處理用的函數(shù),用于驗證oid的合法性,傳遞函數(shù)指針等操作 int header_hrproc(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method); //把變量和值映射到snmp能調(diào)用的內(nèi)部結(jié)構(gòu)中 u_char *var_general_info(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method);

    一個MIB庫中的企業(yè)根節(jié)點:static oid dcs_variables_oid[] = {1,3,6,1,4,1,9000,1 }; //企業(yè)根節(jié)點

    一個variable2類型的結(jié)構(gòu)體,用于對應MIB庫中的各點與程序中要獲取的各項:

    [cpp] view plaincopy print?
  • struct?variable2?dcs_variables[]?=??
  • {??
  • {CPU_USAGE,?ASN_OCTET_STR,?RONLY,?var_general_info,?1,?{1}},?//1,3,6,1,4,1,9000,1,1??
  • {MEMORY_USAGE,?ASN_OCTET_STR,?RONLY,?var_general_info,?1,?{2}},??
  • {DISK_USAGE,?ASN_OCTET_STR,?RONLY,?var_general_info,?1,?{3}},??
  • };??
  • struct variable2 dcs_variables[] = { {CPU_USAGE, ASN_OCTET_STR, RONLY, var_general_info, 1, {1}}, //1,3,6,1,4,1,9000,1,1 {MEMORY_USAGE, ASN_OCTET_STR, RONLY, var_general_info, 1, {2}}, {DISK_USAGE, ASN_OCTET_STR, RONLY, var_general_info, 1, {3}}, };
    注意這里的第一項要以1開始,也就是CPU_USAGE不能為0.

    [cpp] view plaincopy print?
  • //把init_GeneralInfo這個函數(shù)在main.c中替換init_nstAgentSubagentObject();??
  • void?init_GeneralInfo(void)??
  • {??
  • REGISTER_MIB(“vcsky”,?dcs_variables,?variable2,?dcs_variables_oid);??
  • }??
  • //實現(xiàn)get/set命令,在這個函數(shù)中增加各個報警點的處理,獲取值??
  • u_char?*var_general_info(struct?variable?*vp,??
  • oid?*?name,??
  • size_t?*?length,??
  • int?exact,?size_t?*?var_len,?WriteMethod?**?write_method)??
  • {??
  • DEBUGMSGTL((“vcsky”,?“var_general_info?entered\n”));??
  • if?(header_hrproc(vp,?name,?length,?exact,?var_len,?write_method)?==??
  • MATCH_FAILED)??
  • return?NULL;??
  • switch?(vp->magic)??
  • {??
  • case?CPU_USAGE:??
  • {??
  • /*?
  • *?Note?that?the?assumption?that?the?answer?will?be?an?
  • *?integer?does?not?hold?true?in?this?case,?so?the?length?
  • *?of?the?answer?needs?to?be?set?explicitly.?
  • */??
  • int?usedCpu?=?GetUsedCPU();??
  • char?Str_usedCpu[32];??
  • sprintf(Str_usedCpu,”%d”,usedCpu);??
  • *var_len?=?strlen(Str_usedCpu);?//很重要,長度一定要對應上,否則會出錯!??
  • return?(u_char?*)?Str_usedCpu;??
  • }??
  • case?MEMORY_USAGE:??
  • {??
  • int?usedMemory?=?GetUsedMemory();??
  • char?Str_usedMem[32];??
  • sprintf(Str_usedMem,”%d”,usedMemory);??
  • *var_len?=?strlen(Str_usedMem);??
  • return?(u_char?*)?Str_usedMem;??
  • }??
  • case?DISK_USAGE:??
  • {??
  • int?usedDisk?=?GetUsedDisk();??
  • char?Str_usedDisk[32];??
  • sprintf(Str_usedDisk,”%d”,usedDisk);??
  • *var_len?=?strlen(Str_usedDisk);??
  • return?(u_char?*)?Str_usedDisk;??
  • }??
  • default:??
  • DEBUGMSGTL((“snmpd”,?“unknown?sub-id?%d?in?dcs-mib\n”,?vp->magic));??
  • }??
  • return?NULL;??
  • }??
  • int?header_hrproc(struct?variable?*vp,?oid?*?name,?size_t?*?length,int?exact,?size_t?*?var_len,?WriteMethod?**?write_method)??
  • {??
  • oid?newname[MAX_OID_LEN];??
  • int?result;??
  • memcpy((char?*)?newname,?(char?*)?vp->name,??
  • (int)?vp->namelen?*?sizeof(oid));??
  • //newname[vp->namelen]?=?0;?//不需要在已注冊節(jié)點后加“0”,這里和net-snmp源碼不同??
  • result?=?snmp_oid_compare(name,?*length,?newname,?vp->namelen);??
  • if?((exact?&&?(result?!=?0))?||?(!exact?&&?(result?>=?0)))??
  • return?(MATCH_FAILED);??
  • memcpy((char?*)?name,?(char?*)?newname,??
  • ((int)?vp->namelen)?*?sizeof(oid));??
  • *length?=?vp->namelen;??
  • *write_method?=?0;??
  • *var_len?=?sizeof(long);?/*?default?to?‘long’?results?*/??
  • return?(MATCH_SUCCEEDED);??
  • }??
  • //把init_GeneralInfo這個函數(shù)在main.c中替換init_nstAgentSubagentObject(); void init_GeneralInfo(void) { REGISTER_MIB(“vcsky”, dcs_variables, variable2, dcs_variables_oid); } //實現(xiàn)get/set命令,在這個函數(shù)中增加各個報警點的處理,獲取值 u_char *var_general_info(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { DEBUGMSGTL((“vcsky”, “var_general_info entered\n”)); if (header_hrproc(vp, name, length, exact, var_len, write_method) == MATCH_FAILED) return NULL; switch (vp->magic) { case CPU_USAGE: { /* * Note that the assumption that the answer will be an * integer does not hold true in this case, so the length * of the answer needs to be set explicitly. */ int usedCpu = GetUsedCPU(); char Str_usedCpu[32]; sprintf(Str_usedCpu,”%d”,usedCpu); *var_len = strlen(Str_usedCpu); //很重要,長度一定要對應上,否則會出錯! return (u_char *) Str_usedCpu; } case MEMORY_USAGE: { int usedMemory = GetUsedMemory(); char Str_usedMem[32]; sprintf(Str_usedMem,”%d”,usedMemory); *var_len = strlen(Str_usedMem); return (u_char *) Str_usedMem; } case DISK_USAGE: { int usedDisk = GetUsedDisk(); char Str_usedDisk[32]; sprintf(Str_usedDisk,”%d”,usedDisk); *var_len = strlen(Str_usedDisk); return (u_char *) Str_usedDisk; } default: DEBUGMSGTL((“snmpd”, “unknown sub-id %d in dcs-mib\n”, vp->magic)); } return NULL; } int header_hrproc(struct variable *vp, oid * name, size_t * length,int exact, size_t * var_len, WriteMethod ** write_method) { oid newname[MAX_OID_LEN]; int result; memcpy((char *) newname, (char *) vp->name, (int) vp->namelen * sizeof(oid)); //newname[vp->namelen] = 0; //不需要在已注冊節(jié)點后加“0”,這里和net-snmp源碼不同 result = snmp_oid_compare(name, *length, newname, vp->namelen); if ((exact && (result != 0)) || (!exact && (result >= 0))) return (MATCH_FAILED); memcpy((char *) name, (char *) newname, ((int) vp->namelen) * sizeof(oid)); *length = vp->namelen; *write_method = 0; *var_len = sizeof(long); /* default to ‘long’ results */ return (MATCH_SUCCEEDED); }

    核心的代碼就是上面的這些了。通過這幾個函數(shù),能夠?qū)崿F(xiàn)對多個字符串變量的get和set,set命令實現(xiàn)的時候,要注意制作MIB庫時,把節(jié)點設(shè)置為可讀寫權(quán)限。

    總結(jié)

    以上是生活随笔為你收集整理的windows下使用net-snmp实现agent扩展(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。