📄 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 Specificclass 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 + -