初次做snmp编程,高手救命!!
//发送pdu的函数如下,由void CFlowMonitorDlg::OnOK()函数调用,并返回一个回话句柄
HSNMP_SESSION snmpsend(HWND hwnd)
{
SNMPAPI_STATUS stat;
unsigned int wMsg;
HSNMP_SESSION hSession;
HSNMP_ENTITY hSrcEntity;
HSNMP_ENTITY hDstEntity;
smiOCTETS  smiOctet;
HCONTEXT hSendContext;
smiOID sOid;
smiVALUE sValue;
HSNMP_VBL hVbl;
HSNMP_PDU hPdu;
LPCSTR SrcIp,DstIp;
SrcIp="192.168.0.4";     //管理站ip
DstIp="192.168.0.4";    //代理站ip
sValue.syntax=SNMP_SYNTAX_NULL;
sValue.value.uNumber=0;
smiOctet.len=strlen("public");
smiOctet.ptr=(unsigned char *)"public";

hSession=SnmpOpen(hwnd,wMsg);
if(hSession==SNMPAPI_FAILURE) 
AfxMessageBox("初始化失败!",MB_OK);

SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V2);
hSrcEntity=SnmpStrToEntity(hSession,SrcIp);   //创建源实体
hDstEntity=SnmpStrToEntity(hSession,DstIp);  //创建目标实体
if (hSrcEntity==SNMPAPI_FAILURE||hDstEntity==SNMPAPI_FAILURE)
           AfxMessageBox("创建实体失败!");
//设置重传模式
stat=SnmpSetRetransmitMode(SNMPAPI_ON);
if(stat=SNMPAPI_FAILURE)
AfxMessageBox("设置重传模式失败!"); //设置代理超时时间
stat=SnmpSetTimeout(hDstEntity,100);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置代理站超时时间失败!");

//设置管理站超时时间
stat=SnmpSetTimeout(hSrcEntity,100);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置管理站超时时间失败!");
//设置管理站重传次数
stat=SnmpSetRetry(hSrcEntity,5);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置管理站重传次数失败!"); //设置代理重传次数
stat=SnmpSetRetry(hDstEntity,5);
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("设置代理站重传次数失败!"); //创建上下文句柄
hSendContext=SnmpStrToContext(hSession,&smiOctet);
if(hSendContext==SNMPAPI_FAILURE)
AfxMessageBox("创建上下文句柄失败!");

//创建对象描述符
stat=SnmpStrToOid("1.3.6.1.2.1.2.2.1.10",&sOid); 
if(stat==SNMPAPI_FAILURE)
AfxMessageBox("创建对象描述符失败!"); //创建变量捆绑列表
hVbl=SnmpCreateVbl(hSession,&sOid,NULL); 
if(hVbl==SNMPAPI_FAILURE)
AfxMessageBox("创建变量绑定表失败!");

//创建pdu
hPdu=SnmpCreatePdu(hSession,SNMP_PDU_GET,0,NULL,NULL,hVbl);
if (hPdu==SNMPAPI_FAILURE)
AfxMessageBox("创建pdu失败!");
//追加变量绑定表
//  stat=SnmpSetVb(hVbl,0,&sOid,&sValue);
//  if(stat==SNMPAPI_FAILURE)
//  AfxMessageBox("追加变量绑定表失败!"); //发送消息
stat=SnmpSendMsg(hSession,hSrcEntity,hDstEntity,hSendContext,hPdu);
if (stat!=SNMPAPI_SUCCESS)
AfxMessageBox("发送消息失败!"); SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&sOid);
SnmpFreeVbl(hVbl);
SnmpFreePdu(hPdu);
SnmpFreeEntity(hSrcEntity);
SnmpFreeEntity(hDstEntity);
SnmpFreeContext(hSendContext);
return hSession;
}//接受代理返回信息数据
void snmpReceive(HSNMP_SESSION hsession)
{

CString   Re;
LONGLONG  Val=0;
char    cTmp[1024];
int    i;
SNMPAPI_STATUS status;
HSNMP_PDU   hPdu;
HSNMP_VBL   hVbl;
HSNMP_ENTITY  AgntEnt, MngEnt;
HSNMP_CONTEXT hRcvContext;
smiINT    PduType, ErrorStatus, ErrorIndex;
smiINT32   nReqId;
smiVALUE   sVal;
smiOID    sOid;

status=SnmpRecvMsg(hsession,&AgntEnt,&MngEnt,&hRcvContext,&hPdu);
if(status!=SNMPAPI_SUCCESS)
AfxMessageBox("接收消息失败!");//(在这出错了!)
//获得错误信息 
CString str;
    str.Format("%d",SnmpGetLastError(hsession));
AfxMessageBox(str); //status=SnmpGetLastError(hsession);
// AfxMessageBox(Stat);
if (PduType==SNMP_PDU_RESPONSE)
{
status=SnmpGetVb(hVbl,1,&sOid,&sVal);
switch(sVal.syntax)
{
case SNMP_SYNTAX_INT32:
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
Val=sVal.value.sNumber;
break;
case SNMP_SYNTAX_CNTR64:
Val=sVal.value.hNumber.hipart<<32;
Val+=sVal.value.hNumber.lopart;
break;
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_BITS:
case SNMP_SYNTAX_OPAQUE:
memset(cTmp,0,1024);
for(i=0;i<(int)sVal.value.string.len;i++)
cTmp[i]=sVal.value.string.ptr[i];
Re.Format("string:%s",cTmp);
break;
case SNMP_SYNTAX_IPADDR:
case SNMP_SYNTAX_NSAPADDR:
memset(cTmp, 0, 1024);
sprintf(cTmp, "%d.%d.%d.%d",
sVal.value.string.ptr[0],
sVal.value.string.ptr[1],
sVal.value.string.ptr[2],
sVal.value.string.ptr[3]);
Re.Format("String: %s",cTmp);
break;
case SNMP_SYNTAX_OID:
break;
default:
break;
}//end switch sVal.syntax
switch (nReqId) {
case 1:  //1号请求是内存大小
Re.Format("MEM Size is %d", Val);
break;
case 2:  //2号请求是系统描述
Re.Format("System Description is %d", Val);
break;
default:
break;
}//end switch nReqId
SnmpFreePdu(hPdu);
SnmpFreeVbl(hVbl);
SnmpFreeEntity(AgntEnt);
SnmpFreeEntity(MngEnt);
SnmpFreeContext(hRcvContext);
}
}void CFlowMonitorDlg::OnOK() 
{
// TODO: Add extra validation here
HSNMP_SESSION hsession;   //会话句柄
//CDialog::OnOK(); //发送pdu
hsession=snmpsend(this->m_hWnd); //接收消息
snmpReceive(hsession);

}