很多文章都在介紹如何加載安裝net-snmp,但是那些篇幅要麼過于久遠(釋出時間為2年前以上),要麼就是介紹的不夠詳細(比如準備工作,需要用到那些庫或者工具等等),要麼就是……
我現在主要介紹的win10系統安裝最新版本并且适用于“Building With Visual Studio 2005 Express”的操作,就是用類似vs2005(比如VS2010,VS2019)開發工具的開發net-snmp,首先要下載下傳好VS019,這個很簡單自己去搜尋如何在win10先下載下傳安裝VS2019就出來文章一大堆,我是花費了一晚上的時間才把vs2019下載下傳安裝好,當然電腦在下載下傳我在睡覺覺。
如果想要安裝openssl:http://slproweb.com/products/Win32OpenSSL.html;注意要下載下傳不帶Light的版本,就是要下載下傳比較大的包,我建議64位的和32位的最好都要下載下傳一下,因為電腦是64位系統的就用64位的。
在介紹安裝之前首先要做好準備工作:
1.安裝activatestate工具
該工具的官網為:https://www.activestate.com/products/platform/state-tool/
安裝指令為:
powershell -Command "& $([scriptblock]::Create((New-Object Net.WebClient).DownloadString('https://platform.activestate.com/dl/cli/install.ps1')))"
這個指令是需要在win10系統的終端(打開終端方法:win+R,輸入cmd,敲回車就打開了)上運作的,直接敲回車就可以開始該工具的安裝了,記住一定要聯網。
2.安裝activateperl工具
該工具的官網為:https://www.activestate.com/products/perl/downloads/
安裝指令為:
powershell -Command "& $([scriptblock]::Create((New-Object Net.WebClient).DownloadString('https://platform.activestate.com/dl/cli/install.ps1'))) -activate-default ActiveState/Perl-5.32"
這個指令是需要在win10系統的終端(打開終端方法:win+R,輸入cmd,敲回車就打開了)上運作的,直接敲回車就可以開始該工具的安裝了,記住一定要聯網。該指令安裝的perl-5.32版本的。
注意(真的需要注意了):安裝路徑最好是C:\ActiveState\Perl-5.32下面;更加要注意的是“C:\ActiveState\Perl-5.32”中的“ActiveState\Perl-5.32”這個一定要相連,這兩個是一個整體,不要抛棄任何一個,并且“Perl-5.32”一定要在“ActiveState” 目錄下面。因為我剛開始安裝的時候當時能用,但是過來一天就用不了了,有重新開始安裝,每次安裝都花費好久好久(13.5兆大小花費了至少兩小時)。
3.這一步也是很關鍵的,要想避免重新操作第2步,就好好的看這一步:
當第二步安裝perl完成以後,重新打開一個終端,輸入perl -v,若是顯示perl的版本資訊就證明已經安裝好了perl,但是你現在隻是安裝好了perl,還不知道怎麼用它。終端保持着,在終端進入到perl的安裝目錄C:\ActiveState\Perl-5.32下面,然後輸入“state activate”,這一步就是激活了perl,然後就在這裡面運作perl的一些腳本,記住如果不想運作了一定要輸入“exit”退出perl的運作界面,若是直接關閉終端界面,而沒有退出,下次就沒有辦法運作perl了,隻能重走第二步了。
簡單操作步驟總結:
(1)打開終端,cd 到perl安裝目錄“C:\ActiveState\Perl-5.32”
(2)輸入“state activate”(注意這裡其實是state activate ActiveState\Perl-5.32)
這就是為什麼安裝路徑中“ActiveState\Perl-5.32”密不可分的因素,因為到了“C:\ActiveState\Perl-5.32”這個目錄下,是以可以省略後面的項目名稱;可參考網址:https://docs.activestate.com/platform/state/create-project/裡面的“Installing / Importing Packages”和“Activating Your Project”章節
(3)不用perl工具了,輸入“exit”退出
其中相關經驗教訓可參考網址:
https://www.activestate.com/resources/product-demos/activestate-platform-demo-perl-cpanfile/
該連結是介紹安裝完activatestate工具以後,如何建立perl的運作環境,可惜隻有視訊,我也看不了(因為網速太差,視訊打不開,有能打開的小夥伴請一定打開仔細看一看,分享一下),
https://www.activestate.com/resources/product-demos/activestate-platform-demo-state-tool-activate-projects/該網址開始用activatestate工具建立完perl的運作環境以後,介紹怎麼使安裝的perl項目生效。兩個視訊都要看,避免perl老是不能用,然後重回第二步。
4.activatestate工具,activateperl工具,vs2019都安裝好了,接下來就是安裝net-snmp了
(1)首先從一下網址下載下傳net-snmp-5.9.1.zip,然後解壓
https://sourceforge.net/projects/net-snmp/files/net-snmp/5.9.1/
(2)按照一下網址操作進行安裝:
http://www.net-snmp.org/wiki/index.php/Using_the_command_line_and_nmake這個是官方的安裝VS005系列的操作。
簡單介紹一下:
1.打開終端,輸入“cmd /V:ON /E:ON”
2.進入這個路徑“C:\Program Files\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\”,如果是執行這個失敗,可以執行vcvars32.bat(電腦是32位的執行這個)或者vcvars64.bat(電腦是64位的執行這個)或者vcvarsall.bat amd64(vcvarsall.bat後面都要加一個參數),我的電腦是64位是以我就用了執行了vcvars64.bat。
3.然後進入到net-snmp-5.9.1.zip的解壓目錄“C:\net-snmp\win32\build.bat”(我的解壓目錄是這個),執行build.bat就可以了,然後直接按照預設的安裝就行,直接輸入F回車,最後預設的安裝路徑是C:/usr下面;就保持這個路徑就可以了。執行build.bat出現下面界面:
其中用紅色圓圈标記的都是要enabled(其中選項8.Install Perl Modules也可以選中的)的,若第一個OpenSSL support為enabled,則要保證2和3的路徑正确。全部選項設定好以後,就可以按F,安裝了,結果界面如下圖所示:
出現這個結果證明已經安配置安裝成功了,但是隻是安裝了一部分,剩下的部分需要再次執行nmake install_devel進行安裝,這樣就大功告成了。
如果打開7.Perl Mdules就會報下面的錯誤(這個問題我不會解決)
The perl interpreter has been built with gcc instead of MSVC. Giving up.
如果打開11.IPv6 transports就會報下面的錯誤,(這個問題我不會解決)
netsnmpagent.lib(snmp_vars.obj) : error LNK2019: 無法解析的外部符号 netsnmp_udp6_agent_config_tokens_register,函數 init_agent 中引用了該符号
netsnmpmibs.lib(vacm_conf.obj) : error LNK2019: 無法解析的外部符号 netsnmp_udp6_parse_security,函數 vacm_create_simple 中引用了該符号
netsnmpmibs.lib(vacm_conf.obj) : error LNK2019: 無法解析的外部符号 netsnmp_udp6_getSecName,函數 vacm_check_view_contents 中引用了該符号
netsnmpmibs.lib(vacm_conf.obj) : error LNK2001: 無法解析的外部符号 netsnmp_UDPIPv6Domain
netsnmpmibs.lib(vacm_conf.obj) : error LNK2001: 無法解析的外部符号 netsnmp_TCPIPv6Domain
..\bin\.\release\snmptrapd.exe : fatal error LNK1120: 5 個無法解析的外部指令
NMAKE : fatal error U1077: ??"D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\HostX64\x64\link.exe"??: ???ش??롰0x460??
Stop.
NMAKE : fatal error U1077: ??"D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30037\bin\HostX64\x64\nmake.EXE"??: ???ش??롰0x2??
Stop.
後續還有什麼不清楚的可以私聊,加上其他選項也老是報錯。是以隻安裝了最簡單的。
最後在介紹一點,用vs2019開發的時候,如何加載snmp的頭檔案和庫,前面我有篇文章已經介紹了,接下來我還要補充一點:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <winsock2.h>
#pragma comment(lib,"netsnmp.lib")
#pragma comment(lib,"netsnmpagent.lib")
#pragma comment(lib,"netsnmpmibs.lib")
#pragma comment(lib,"WS2_32.lib")
這個要包含的頭檔案和庫,其中頭檔案winsock2.h和庫WS2_32.lib都是必不可少的,要不然會報錯。
下面附上一個測試代碼,直接複制粘貼就可以運作,如果出現列印結果就說明你已經在用net-snmp的庫了,但是應該不會出現結果因為服務還沒有起來,若需要啟動服務還需要配置一系列的snmp.conf檔案,其中配置這些檔案都可以通過/usr/bin/snmpconf這個腳本檔案來實作,關于這個腳本的介紹在這個網址:http://www.net-snmp.org/docs/man/snmpconf.html。隻可惜我按照要求運作了腳本(指令:snmpconf -g basic_setup)以後卻總是出現報錯界面,是以就沒有辦法配置了:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <winsock2.h>
#pragma comment(lib,"netsnmp.lib")
#pragma comment(lib,"netsnmpagent.lib")
#pragma comment(lib,"netsnmpmibs.lib")
#pragma comment(lib,"WS2_32.lib")
int main()
{
struct snmp_session session, * ss;
struct snmp_pdu* pdu;
struct snmp_pdu* response;
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
struct variable_list* vars;
int status;
//init_snmp("snmpapp");
snmp_sess_init(&session);
session.peername = (char *)"test.net-snmp.org";
#ifdef DEMO_USE_SNMP_VERSION_3
session.version = SNMP_VERSION_3;
session.securityName = strdup("MD5User");
session.securityNameLen = strlen(session.securityName);
session.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV;
session.securityAuthProto = usmHMACMD5AuthProtocol;
session.securityAuthProtoLen = sizeof(usmHMACMD5AuthProtocol) / sizeof(oid);
session.securityAuthKeyLen = USM_AUTH_KU_LEN;
if (generate_Ku(session.securityAuthProto,session.securityAuthProtoLen,
(u_char*)our_v3_passphrase, strlen(our_v3_passphrase),
session.securityAuthKey,
&session.securityAuthKeyLen) != SNMPERR_SUCCESS) {
snmp_perror(argv[0]);
snmp_log(LOG_ERR,"Error generating Ku from authentication pass phrase. \n");
exit(1);
}
#else
session.version = SNMP_VERSION_1;
session.community = (u_char *)"demopublic";
session.community_len = strlen((char *)session.community);
#endif
printf("i i am snmp\n");
printf("hello world i i am snmp\n");
return 0;
}
有不足之處,還請私聊或者在下面評論指出,一起研發,共同進步。