1. 程式人生 > >Snmp在Windows下的實現----WinSNMP程式設計原理

Snmp在Windows下的實現----WinSNMP程式設計原理

3.3.2 WinSNMP接受響應訊息
還記得前面的SnmpCreateSession函式嗎?它可以說是WinSNMP非同步訊息驅動模式的一個關鍵,讓我們先來看看它的函式原型:
HSNMP_SESSION SnmpCreateSession(
HWND hWnd,                    // handle to the notification window
UINT wMsg,                    // window notification message number
SNMPAPI_CALLBACK fCallback,   // notification callback function
LPVOID lpClientData           // pointer to callback function data
);
它提供了兩種方式的非同步訊息驅動,我們可以讓WinSNMP在有響應訊息到達時傳送一個訊息給系統,也可以讓它自動呼叫一個函式。筆者採用了第一種方式,實現如下:
session=SnmpCreateSession(m_hWnd,wMsg,NULL,NULL);
我們可以給訊息wMsg建立一個訊息處理函式,在這個函式裡處理訊息的接收、資訊的提取與處理等事務。
下面我們將具體描述WinSNMP接受響應訊息的步驟。
(1) 呼叫SnmpRecvMsg函式接收資料
(2) 呼叫SnmpGetPduData函式從PDU中析取出資料,
(3) 呼叫SnmpCountVbl獲得變數繫結列表中變數繫結的個數
(4) 呼叫SnmpGetVb函式取得PDU變數繫結表中每個變數繫結的OID及其對應的值,可以指明該變數繫結在變數繫結表中的位置。參考實現如下:
int nCount=SnmpCountVbl(varbindlist);
for(int index=1;i<=nCount;i++)
SnmpGetVb(varbindlist,index,&Oid,value[i]);
其中,index指定了變數繫結的位置,value[i]表示接收到的OID變數的值,是smiLPVALUE型別的,Oid表示接收到的變數繫結的OID。
對於value[i],我們可以參考3.2.6.3節,按照它的syntax成員,用select case語句,分別轉換為字串或整數型別。
(5) 呼叫SnmpOidToStr函式將Oid轉換為字串。並將接收到的Oid與傳送資料包的各OID做比較,已決定各自值的歸屬。引用一段程式碼
if(strcmp(m_sOid[i],m_initOid[1])==0)
   m_sDesr= str[i];
else if (strcmp(m_sOid[i],m_initOid[2])==0)
   m_sSysOid=str[i];
else if (strcmp(m_sOid[i],m_initOid[3])==0)
   m_sSysTime=str[i];
else if (strcmp(m_sOid[i],m_initOid[4])==0)
   m_sName=str[i];
else if (strcmp(m_sOid[i],m_initOid[5])==0)
   {m_sIpin=str[i];
   m_nIpin=nIpin;}
else if(strcmp(m_sOid[i],m_initOid[6])==0)
   m_sIpout=str[i];
當我們比較傳送的OID與接收到的OID時,我們就知道了這個str[i]是屬於哪個OID的值,應當放在哪裡顯示,以m_s開頭的變數都代表了不同的label,這樣,相應的值就在相應的字串中顯示。