pdu_cont.h
上传用户:czjinwang
上传日期:2007-01-12
资源大小:2484k
文件大小:9k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*===================================================================
  2.   Copyright (c) 1999
  3.   Hewlett-Packard Company
  4.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  5.   Permission to use, copy, modify, distribute and/or sell this software 
  6.   and/or its documentation is hereby granted without fee. User agrees 
  7.   to display the above copyright notice and this license notice in all 
  8.   copies of the software and any documentation of the software. User 
  9.   agrees to assume all liability for the use of the software; Hewlett-Packard 
  10.   makes no representations about the suitability of this software for any 
  11.   purpose. It is provided "AS-IS without warranty of any kind,either express 
  12.   or implied. User hereby grants a royalty-free license to any and all 
  13.   derivatives based upon this software code base. 
  14.   SNMP++ P D U _ C O N T . H
  15.   PDU CONTAINER CLASS DEFINITION ( MS-WINDOWS 32 Only)
  16.   VERSION
  17.   2.8
  18.   RCS INFO:
  19.   $Header: pdu_cont.h,v 1.12 96/03/16 15:55:22 hmgr Exp $
  20.   DESCRIPTION:
  21.   This module contains the class definition for the pdu
  22.   container class. The pdu conatiner is specific to the
  23.   windows 3.1 implementation to allow multiple outstanding
  24.   pdu requests.
  25.   DESIGN:
  26.   Peter E Mellquist
  27.   AUTHOR:
  28.   Peter E Mellquist
  29.   LANGUAGE:
  30.   ANSI C++
  31.   OPERATING SYSTEM(S):
  32.   Win32
  33.   BSD UNIX
  34. =====================================================================*/
  35. #ifndef _PDU_CONT
  36. #define _PDU_CONT
  37. #include "winsnmp.h"   // windows snmp engine include
  38. #include "smi.h"       // various smi defs
  39. //------[ forward declarations ]-----------------------------
  40. class Snmp;
  41. class Pdu;
  42. class SnmpTarget;
  43. //--------[ Note!! ]------------------------------------------------------
  44. // The following define determines the maximum number of outstanding
  45. // pdu requests that an app can have. A sinlge machine may have multiple
  46. // apps If an app has more than this number of outstanding requests, snmp access
  47. // member functions will fail with a SNMP_CLASS_QUEUE_FULL error.
  48. // This value may be increased depending on the apps demands.
  49. //
  50. #define MAX_PDU_SLOTS  300   // maximum queue length of pdu container
  51. #define MAX_REQUEST_ID 9000   // starting request id
  52. #define MIN_REQUEST_ID 10   // ending request id, before reset to max
  53. #ifdef _SNMPDEBUG
  54. #define SNMPDEBUG(s)    OutputDebugString(s)
  55. #else
  56. #define SNMPDEBUG(s)
  57. #endif
  58. //-----------[ callback typedef ]------------------------------------------
  59. typedef void (WINFAR *snmpcallback)( int,       // reason
  60.      Snmp*,       // session handle
  61.      Pdu &,       // pdu passsed in
  62.      SnmpTarget &,    // source target
  63.      void * ); // optional personality
  64. //-----------[ pdu container class defs ]----------------------------------
  65. //
  66. // The pdu conatiner handles storage of all incoming pdus. Each Ssnmp object
  67. // instance creates its own hidden window. When the session is created,
  68. // the Win Snmp DLL is informed of the win proc. A common win proc is used
  69. // to feed the pdu conatiner class. In this manner multiple concurrent
  70. // blocked calls may be made.
  71. // pdu container slot struct
  72. // WinSnmp Specific
  73. class Pdu_Slot
  74. {
  75. public:
  76.   long int     request_id;    // associated request id
  77.   int     pending;    // is this slot filled?
  78.   int     pdu_arrived;   // has the pdu arrived yet
  79.   HSNMP_SESSION     hSession;    // WinSnmp Session handle
  80.   HSNMP_ENTITY     hSourceEntity; // Source Entity
  81.   HSNMP_ENTITY     hDestEntity;   // Destination Entity
  82.   HSNMP_CONTEXT     hRecContext;   // Receive Context
  83.   smiINT     PduType;    // Type of pdu
  84.   smiINT     RequestId;    // Request ID
  85.   smiINT     ErrorStatus;   // Error Status
  86.   smiINT     ErrorIndex;    // Error Index
  87.   snmpcallback     callback;    // callback function for async calls
  88.   void *     callback_data; // callback data
  89.   HSNMP_VBL     hRecVbl;    // Received Variable Binding List
  90. };
  91. //------[ pdu container class ]-----------------------------------
  92. class Pdu_Container {
  93. public:
  94.   // constructor
  95.   // initialize all the slots to not pending
  96.   // clear all the statistic counters
  97.   Pdu_Container();
  98.   // destructor
  99.   ~Pdu_Container();
  100.   // statistic mutator methods
  101.   void pdu_sent()   { pdus_sent++;};
  102.   void pdu_received()   { pdus_received++;};
  103.   void trap_received()   { trap_count++;};
  104.   void traps_sent() { trap_sent++; }
  105.   void decode_err()   { decode_errors++;};
  106.   void stray_response()   { stray_responses++;};
  107.   void invalid_resp_pdu() { invalid_pdu_types++;};
  108.   void receive_err()   { pdus_received_err++;};
  109.   void sent_err()   { pdus_sent_err++;};
  110.   void timeout()   { timeout_count++; };
  111.   void set_max_queue( int z)
  112.       { if ( z > (int) max_queue_size)
  113. max_queue_size = ( unsigned long int) z; };
  114.   // statistic accessor methods
  115.   unsigned long int get_pdus_sent() { return pdus_sent; };
  116.   unsigned long int get_pdus_received() { return pdus_received; };
  117.   unsigned long int get_received_errs() { return pdus_received_err; };
  118.   unsigned long int get_sent_errs() { return pdus_sent_err; };
  119.   unsigned long int get_timeouts() { return timeout_count; };
  120.   unsigned long int get_max_queue() { return max_queue_size; };
  121.   unsigned long int get_trap_count() { return trap_count; };
  122.   unsigned long int get_traps_sent()    { return trap_sent; }
  123.   unsigned long int get_decode_errs() { return decode_errors; };
  124.   unsigned long int get_inval_resp() { return invalid_pdu_types; };
  125.   unsigned long int get_stray_resp() { return stray_responses; };
  126.   // get a request id
  127.   // this mf finds the first available slot and returns its
  128.   // index value. The value is changed to reflect it is now
  129.   // occupied. an error value is returned when no slots are
  130.   // available
  131.   // passed in rid may be passed back unless it is non-zero
  132.   // calling get_request_id with 0 will cause a new unique
  133.   // rid to be generated
  134.   long int get_request_id( HSNMP_SESSION hSession, 
  135.                        snmpcallback cab,
  136.                void * cbd);
  137.   // return a rid, don't save it in the pending table
  138.   // used when sending a trap or any other non responsed pdu
  139.   long int get_request_id();
  140.   // clear the slot to make it available again
  141.   void clear_request_id( const long int rid);
  142.   // check if a pending pdu has arrived
  143.   int check_if_arrived( const long int rid);
  144.   // determine if a pdu slot is pending
  145.   // received pdus are only placed into a slot
  146.   // if it is pending
  147.   int check_if_pending( const long int rid, snmpcallback *cb);
  148.   void search_and_destroy( HSNMP_SESSION hSession, Snmp *snmp);
  149.   // set a slot with an arrived pdu
  150.   void set_slot( long int rid,   // rid to set as arrived
  151.  HSNMP_SESSION    hSession,   // WinSnmp Session handle
  152.  HSNMP_ENTITY    hSourceEntity, // Source Entity
  153.  HSNMP_ENTITY    hDestEntity,   // Destination Entity
  154.  HSNMP_CONTEXT    hRecContext,   // Receive Context
  155.  smiINT    PduType,   // Type of pdu
  156.  smiINT    RequestId,   // Request ID
  157.  smiINT    ErrorStatus,   // Error Status
  158.  smiINT    ErrorIndex,   // Error Index
  159.  HSNMP_VBL    hRecVbl);   // Received Variable Binding List
  160.   // get the data from a slot
  161.   //
  162.   void get_slot( long int rid,       // for this rid
  163.     HSNMP_ENTITY  *hSrcRecvEnt,       // recieved source entity
  164.     HSNMP_ENTITY  *hDstRecvEnt,       // recieved destination entity
  165.     HSNMP_CONTEXT *hRecvContext,      // recieved context
  166.     smiINT *lnRecvPduType,           // type of pdu
  167.     smiINT *lnRecvRequestId,       // request id
  168.     smiINT *lnErrorStatus,           // error status
  169.     smiINT *lnErrorIndex,           // error index
  170.     snmpcallback *cb,           // callback funstion ptr
  171.     void * *cbd,               // callback data
  172.     HSNMP_VBL *hRecvVbl);           // recieved variable binding list
  173.   // get callback information from a
  174.   // given async call entry
  175.   // returns true if an entryt was found
  176.   // else returns false indicating no entry
  177.   // was found for the requested rid
  178.   int get_cb_info( long int rid,
  179.     snmpcallback *cb,
  180.     void * *cbd);
  181. protected:
  182.   Pdu_Slot *slots[MAX_PDU_SLOTS]; // slots for arrivals
  183.   // statistics vars
  184.   unsigned long int pdus_sent; // total # of pdus sent
  185.   unsigned long int pdus_received; // total # of pdus received
  186.   unsigned long int pdus_received_err; // received error count
  187.   unsigned long int pdus_sent_err; // sent error count
  188.   unsigned long int timeout_count; // # of timeouts
  189.   unsigned long int max_queue_size; // maximum queue size
  190.   unsigned long int trap_count; // number of traps received
  191.   unsigned long int trap_sent;      // number of traps sent
  192.   unsigned long int decode_errors; // number of snmp decode errors
  193.   unsigned long int stray_responses; // number of stray responses
  194.   unsigned long int invalid_pdu_types; // number of unided pdu types
  195.   long int current_request_id; // current request id
  196. };
  197. #endif //_PDU_CONT