⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdu_cont.cpp

📁 SNMP++程序源码 for ll .8snmp++2_8.tar.Z 嵌入式linux环境下的SNMP开发代码
💻 CPP
字号:
/*===================================================================  Copyright (c) 1999  Hewlett-Packard Company  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.  Permission to use, copy, modify, distribute and/or sell this software   and/or its documentation is hereby granted without fee. User agrees   to display the above copyright notice and this license notice in all   copies of the software and any documentation of the software. User   agrees to assume all liability for the use of the software; Hewlett-Packard   makes no representations about the suitability of this software for any   purpose. It is provided "AS-IS without warranty of any kind,either express   or implied. User hereby grants a royalty-free license to any and all   derivatives based upon this software code base.     P D U _ C O N T . C P P  PDU CONTAINER CLASS IMPLEMENTATION  DESIGN:  Peter E Mellquist  AUTHOR:  Peter E Mellquist  DATE:  July 25, 1999  DESCRIPTION:  This module contains the implementation for the pdu  container class.    LANGUAAGE:  ANSI C++  OPERATING SYSTEM(S):  Win32=====================================================================*/char pducls_cpp_version[]="#(@)SNMP++ 2.8 $Header: pdu_cont.cpp,v 1.10 96/03/16 16:02:46 hmgr Exp $";#include "pdu_cont.h"	 // include file for pdu class#include "winsnmp.h"	 // winsnmp include file#include "pdu.h"         // include pdu class definition#include "snmperrs.h"    // include snmp error messages#include "target.h"//--------------[  Pdu_Container::Pdu_Container() ]--------------------// constructor// initialize all the slots to not pending// clear all the statistic countersPdu_Container::Pdu_Container(){  int z;  for (z=0;z<MAX_PDU_SLOTS;z++)     slots[z] = NULL;	   // init stats  pdus_sent = 0;  pdus_received = 0;  pdus_received_err = 0;  pdus_sent_err = 0;  timeout_count = 0;  max_queue_size = 0;  trap_count = 0;  trap_sent = 0;  decode_errors = 0;  stray_responses = 0;  invalid_pdu_types = 0;  current_request_id = MAX_REQUEST_ID;};// destructorPdu_Container::~Pdu_Container(){   for (int z=0;z<MAX_PDU_SLOTS;z++)	   delete slots[z];};//-------[ search for any dangling enteries//	   for a given WinSNMP sessionvoid Pdu_Container::search_and_destroy( HSNMP_SESSION hSession, Snmp *snmp){  int z;  for (z=0;z<MAX_PDU_SLOTS;z++)  {     if (( slots[z]!= NULL ) && ( slots[z]->hSession == hSession))     {		if ( slots[z]->pdu_arrived )		{	    SNMPDEBUG("++ SNMP++, Search and Destroy Hit\n");        // check to see if it was an async request then        // we need to inform the callback with the         // SNMP_CLASS_SESSION_DESTROYED message        if ( slots[z]->callback != NULL)        {           // fire destroy message to the specified callback           SNMPDEBUG("++ SNMP++, Destroying Snmp Object Async Notify\n");           // we don't have the actual pdu, just the rid           Pdu pdu;           set_request_id( &pdu, slots[z]->RequestId);            CTarget v1t;          (slots[z]->callback)( (int) SNMP_CLASS_SESSION_DESTROYED, // reason	                       (Snmp*) snmp,	                   // snmp++ session who own the req		               (Pdu&) pdu,		           // pdu		               (SnmpTarget&) v1t,                  // target		               (void*) slots[z]->callback_data);    // callback data        }	// free up the WinSNMP variables	SnmpFreeEntity( slots[z]->hSourceEntity);	SnmpFreeEntity( slots[z]->hDestEntity);	SnmpFreeContext( slots[z]->hRecContext);	SnmpFreeVbl( slots[z]->hRecVbl);	}	// free up the slot        delete slots[z];	slots[z] = NULL;        }  };};//-------[ get a request id, don't save it in the pending table ]------long int Pdu_Container::get_request_id(){   current_request_id--;   if (current_request_id < MIN_REQUEST_ID)     current_request_id = MAX_REQUEST_ID;   return current_request_id;};//--------[ get a request is from the pdu container class ]---------// this one records the rid in the pending tablelong int Pdu_Container::get_request_id( HSNMP_SESSION hSession,									    snmpcallback cb,					                    void * cbd){  int z=0;  while (z<MAX_PDU_SLOTS)  {     long int my_rid;     if ( slots[z] == NULL)     {       current_request_id--;       if (current_request_id < MIN_REQUEST_ID)	      current_request_id = MAX_REQUEST_ID;       my_rid = current_request_id;       slots[z] = new Pdu_Slot;       if ( slots[z] == NULL)          return -1;       slots[z]->pending = TRUE;	      // this request is pending       slots[z]->pdu_arrived = FALSE;	  // response has not arrived       slots[z]->hSession = hSession;	  // no session handle       slots[z]->request_id = my_rid;	  // set rid pending       slots[z]->callback = cb;		      // remember callback ptr       slots[z]->callback_data = cbd;	  // remember callback data       set_max_queue( z);       return my_rid;     }     z++;  }  return -1;  // no slots available};//------------[ Pdu_Container::clear_request_id(long int rid) ]----------// clear the slot to make it available againvoid Pdu_Container::clear_request_id( const long int rid){   int w=0;   while ( w < MAX_PDU_SLOTS)   {     if ((slots[w] != NULL) && ( slots[w]->request_id == rid))	     {        delete slots[w];        slots[w] = NULL;	    return;     }     w++;   }};//----------[ Pdu_Container::check_if_arrived( long int rid) ]----------// check if a pending pdu has arrivedint Pdu_Container::check_if_arrived( const long int rid){  int w=0;  // look through all the slots for a rid match  // and an arrival  while(w<MAX_PDU_SLOTS)  {     if (( slots[w] != NULL) &&( slots[w]->request_id == rid)&&(slots[w]->pdu_arrived))       return TRUE;     w++;  }  return FALSE;};//------[ Pdu_Container::check_if_pending( long int rid) ]-----------// determine if a pdu slot is pending// received pdus are only placed into a slot// if it is pendingint Pdu_Container::check_if_pending( const long int rid, snmpcallback *cb){  int w=0;  // look for a rid match and a pending request  // if found, return the callback ptr  while ( w<MAX_PDU_SLOTS)  {     if (( slots[w] != NULL) &&(slots[w]->request_id ==rid)&&(slots[w]->pending))     {	*cb = slots[w]->callback;	return TRUE;   // don't pull the data out, just report it there     }     w++;  }  *cb = 0;  return FALSE;};//---------[ Pdu_Container::set_slot ]----------------------------------// set a slot with an arrived pduvoid Pdu_Container::set_slot( long int rid,	 // slot to set as arrived		 HSNMP_SESSION hSession,	 // WinSnmp Session handle		 HSNMP_ENTITY  hSourceEntity,	 // Source Entity		 HSNMP_ENTITY  hDestEntity,	 // Destination Entity		 HSNMP_CONTEXT hRecContext,	 // Receive Context		 smiINT	       PduType,		 // Type of pdu		 smiINT	       RequestId,	 // Request ID		 smiINT	       ErrorStatus,	 // Error Status		 smiINT	       ErrorIndex,	 // Error Index		 HSNMP_VBL     hRecVbl)		 // Received Variable Binding List{    int w=0;    int z=-1;    SNMPDEBUG("++ SNMP++, in Set Slot \n");    // find the slot    while (w<MAX_PDU_SLOTS)    {       if (( slots[w] != NULL) &&( slots[w]->request_id == rid))	 z = w;       w++;    }    if ((z<0)||(z>=MAX_PDU_SLOTS)) return;    slots[z]->pdu_arrived = TRUE;	      // mark as arrived    // fill in the params    slots[z]->hSession = hSession;    slots[z]->hSourceEntity = hSourceEntity;    slots[z]->hDestEntity = hDestEntity;    slots[z]->hRecContext = hRecContext;    slots[z]->PduType = PduType;    slots[z]->RequestId = RequestId;    slots[z]->ErrorStatus = ErrorStatus;    slots[z]->ErrorIndex = ErrorIndex;    slots[z]->hRecVbl = hRecVbl;    SNMPDEBUG("++ SNMP++, Out Set Slot \n");};//------------[ Pdu_Container::get_slot ]------------------------------// get the data from a slot//void Pdu_Container::get_slot( long int rid, // for this rid	    HSNMP_ENTITY  *hSrcRecvEnt,	    HSNMP_ENTITY  *hDstRecvEnt,	    HSNMP_CONTEXT *hRecvContext,	    smiINT *lnRecvPduType,	    smiINT *lnRecvRequestId,	    smiINT *lnErrorStatus,	    smiINT *lnErrorIndex,	    snmpcallback *cb,	    void * *cbd,	    HSNMP_VBL *hRecvVbl){    int w=0;    int z=-1;    // find the slot    while (w<MAX_PDU_SLOTS)    {       if ((slots[w] != NULL) &&( slots[w]->request_id == rid))	 z = w;       w++;    }    if ((z<0)||(z>=MAX_PDU_SLOTS))       return;     // fill in the return variables     *hSrcRecvEnt = slots[z]->hSourceEntity;     *hDstRecvEnt = slots[z]->hDestEntity;     *hRecvContext = slots[z]->hRecContext;     *lnRecvPduType = slots[z]->PduType;     *lnRecvRequestId = slots[z]->RequestId;     *lnErrorStatus = slots[z]->ErrorStatus;     *lnErrorIndex = slots[z]->ErrorIndex;     *hRecvVbl = slots[z]->hRecVbl;     *cb = slots[z]->callback;     *cbd = slots[z]->callback_data;     // clear the slot     delete slots[z];     slots[z] = NULL;};// return the callback information for// a given request idint Pdu_Container::get_cb_info( long int rid,				 snmpcallback *cb,				 void * *cbd){    int w=0;    int z=-1;    // find the slot    while (w<MAX_PDU_SLOTS)    {       if (( slots[w] != NULL ) &&( slots[w]->request_id == rid)&&( slots[w]->callback !=0))	 z = w;       w++;    }    if ((z<0)||(z>=MAX_PDU_SLOTS))    {       *cb=0;       *cbd=0;       return FALSE;    }     // fill in the return variables     *cb = slots[z]->callback;     *cbd = slots[z]->callback_data;     delete slots[z];     slots[z] = NULL;     return TRUE;};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -