📄 pdu_cont.h
字号:
/*===================================================================
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.
SNMP++ P D U _ C O N T . H
PDU CONTAINER CLASS DEFINITION ( MS-WINDOWS 32 Only)
VERSION
2.8
RCS INFO:
$Header: pdu_cont.h,v 1.12 96/03/16 15:55:22 hmgr Exp $
DESCRIPTION:
This module contains the class definition for the pdu
container class. The pdu conatiner is specific to the
windows 3.1 implementation to allow multiple outstanding
pdu requests.
DESIGN:
Peter E Mellquist
AUTHOR:
Peter E Mellquist
LANGUAGE:
ANSI C++
OPERATING SYSTEM(S):
Win32
BSD UNIX
=====================================================================*/
#ifndef _PDU_CONT
#define _PDU_CONT
#include "winsnmp.h" // windows snmp engine include
#include "smi.h" // various smi defs
//------[ forward declarations ]-----------------------------
class Snmp;
class Pdu;
class SnmpTarget;
//--------[ Note!! ]------------------------------------------------------
// The following define determines the maximum number of outstanding
// pdu requests that an app can have. A sinlge machine may have multiple
// apps If an app has more than this number of outstanding requests, snmp access
// member functions will fail with a SNMP_CLASS_QUEUE_FULL error.
// This value may be increased depending on the apps demands.
//
#define MAX_PDU_SLOTS 300 // maximum queue length of pdu container
#define MAX_REQUEST_ID 9000 // starting request id
#define MIN_REQUEST_ID 10 // ending request id, before reset to max
#ifdef _SNMPDEBUG
#define SNMPDEBUG(s) OutputDebugString(s)
#else
#define SNMPDEBUG(s)
#endif
//-----------[ callback typedef ]------------------------------------------
typedef void (WINFAR *snmpcallback)( int, // reason
Snmp*, // session handle
Pdu &, // pdu passsed in
SnmpTarget &, // source target
void * ); // optional personality
//-----------[ pdu container class defs ]----------------------------------
//
// The pdu conatiner handles storage of all incoming pdus. Each Ssnmp object
// instance creates its own hidden window. When the session is created,
// the Win Snmp DLL is informed of the win proc. A common win proc is used
// to feed the pdu conatiner class. In this manner multiple concurrent
// blocked calls may be made.
// pdu container slot struct
// WinSnmp Specific
class Pdu_Slot
{
public:
long int request_id; // associated request id
int pending; // is this slot filled?
int pdu_arrived; // has the pdu arrived yet
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
snmpcallback callback; // callback function for async calls
void * callback_data; // callback data
HSNMP_VBL hRecVbl; // Received Variable Binding List
};
//------[ pdu container class ]-----------------------------------
class Pdu_Container {
public:
// constructor
// initialize all the slots to not pending
// clear all the statistic counters
Pdu_Container();
// destructor
~Pdu_Container();
// statistic mutator methods
void pdu_sent() { pdus_sent++;};
void pdu_received() { pdus_received++;};
void trap_received() { trap_count++;};
void traps_sent() { trap_sent++; }
void decode_err() { decode_errors++;};
void stray_response() { stray_responses++;};
void invalid_resp_pdu() { invalid_pdu_types++;};
void receive_err() { pdus_received_err++;};
void sent_err() { pdus_sent_err++;};
void timeout() { timeout_count++; };
void set_max_queue( int z)
{ if ( z > (int) max_queue_size)
max_queue_size = ( unsigned long int) z; };
// statistic accessor methods
unsigned long int get_pdus_sent() { return pdus_sent; };
unsigned long int get_pdus_received() { return pdus_received; };
unsigned long int get_received_errs() { return pdus_received_err; };
unsigned long int get_sent_errs() { return pdus_sent_err; };
unsigned long int get_timeouts() { return timeout_count; };
unsigned long int get_max_queue() { return max_queue_size; };
unsigned long int get_trap_count() { return trap_count; };
unsigned long int get_traps_sent() { return trap_sent; }
unsigned long int get_decode_errs() { return decode_errors; };
unsigned long int get_inval_resp() { return invalid_pdu_types; };
unsigned long int get_stray_resp() { return stray_responses; };
// get a request id
// this mf finds the first available slot and returns its
// index value. The value is changed to reflect it is now
// occupied. an error value is returned when no slots are
// available
// passed in rid may be passed back unless it is non-zero
// calling get_request_id with 0 will cause a new unique
// rid to be generated
long int get_request_id( HSNMP_SESSION hSession,
snmpcallback cab,
void * cbd);
// return a rid, don't save it in the pending table
// used when sending a trap or any other non responsed pdu
long int get_request_id();
// clear the slot to make it available again
void clear_request_id( const long int rid);
// check if a pending pdu has arrived
int check_if_arrived( const long int rid);
// determine if a pdu slot is pending
// received pdus are only placed into a slot
// if it is pending
int check_if_pending( const long int rid, snmpcallback *cb);
void search_and_destroy( HSNMP_SESSION hSession, Snmp *snmp);
// set a slot with an arrived pdu
void set_slot( long int rid, // rid 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
// get the data from a slot
//
void get_slot( long int rid, // for this rid
HSNMP_ENTITY *hSrcRecvEnt, // recieved source entity
HSNMP_ENTITY *hDstRecvEnt, // recieved destination entity
HSNMP_CONTEXT *hRecvContext, // recieved context
smiINT *lnRecvPduType, // type of pdu
smiINT *lnRecvRequestId, // request id
smiINT *lnErrorStatus, // error status
smiINT *lnErrorIndex, // error index
snmpcallback *cb, // callback funstion ptr
void * *cbd, // callback data
HSNMP_VBL *hRecvVbl); // recieved variable binding list
// get callback information from a
// given async call entry
// returns true if an entryt was found
// else returns false indicating no entry
// was found for the requested rid
int get_cb_info( long int rid,
snmpcallback *cb,
void * *cbd);
protected:
Pdu_Slot *slots[MAX_PDU_SLOTS]; // slots for arrivals
// statistics vars
unsigned long int pdus_sent; // total # of pdus sent
unsigned long int pdus_received; // total # of pdus received
unsigned long int pdus_received_err; // received error count
unsigned long int pdus_sent_err; // sent error count
unsigned long int timeout_count; // # of timeouts
unsigned long int max_queue_size; // maximum queue size
unsigned long int trap_count; // number of traps received
unsigned long int trap_sent; // number of traps sent
unsigned long int decode_errors; // number of snmp decode errors
unsigned long int stray_responses; // number of stray responses
unsigned long int invalid_pdu_types; // number of unided pdu types
long int current_request_id; // current request id
};
#endif //_PDU_CONT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -