SNMP++的设计(决定了它)支持多种运行模式。这些运行模式允许(用户)创建图形用户接口(GUI)以及控制台模式的应用。GUI运行模式与现有的GUI事件(驱动)系统协同工作;而控制台运行模式允许使用自定义的事件(驱动)系统,甚至不需要事件(驱动)系统。
为了在MS-Windows上使用,SNMP++与MS-Windows消息系统协同工作。调用阻塞模式(可以)允许处理其他消息。
X11接口与MS-Windows接口一样。在MS-Windows和X11各种版本上的SNMP++都支持阻塞和异步方式的使用。为了用SNMP++对X11应用注册X11的上下文(context)需要一个额外的函数(该操作是为了在X11的事件系统上使用SNMP++)。这就要用到XtAppMainLoop()或类似的函数来显式地认可并分发所有异步的SNMP++事件。
· The context parameter passed in is returned from a call to XtAppInitialize().
· The return value is zero if the function is successful in registering with X11.
· (需要)传入的上下文参数会由XtAppInitialize()的调用返回
· 如果对X11注册成功,则该函数返回零
//----------------[ initialize SNMP++ X11 Context ]--------------------------
int SNMPX11Initialize( XtAppContext context);
SNMP++的第三种运作模式是用文本形式构造的控制台应用。这些类型的应用上的操作也可以调用阻塞或异步的模式。SNMP++提供了一组函数调用来读取当前用到的文件描述符(socket handles)。调用者在它们各自的“select”调用中用到这些文件描述符。如果SNMP++文件描述符有一个挂起的事件,调用者将激活例行程序来处理所有挂起的事件。
SNMPGetFdSets
用以决定需要潜在地激活的文件描述符。该函数会填充读、写、异常模块,以便传递到“select”。
//-------[ get file descriptor set from SNMP++ ]------------------------------------
void SNMPGetFdSets( int &maxfds, // max # of fds represented
fd_set &read_fds, // mask representing read actions
fd_set &write_fds, // mask representing write actions
fd_set &exceptfds); // mask representing exception actions
SNMPGetNextTimeout
用以决定下次出现超时事件的时间。该值可在阻塞操作中被用作最大间隔值。比如select在控制权返回之前必须等待(该间隔时间)。超时的计算的基础是:所有用户注册超时(user-registered time-outs)以及SNMP重发的时间间隔中最近的一次。
//---------[ Get the next time-out value ]----------------------------------------------------
unsigned long int SNMPGetNextTimeout( ); // returns value in 1/100 of seconds
SNMPProcessPendingEvents
用以处理目前所有的突出的(outstanding)事件。该函数会调用所有与已完成的超时、文件描述符或突出的(outstanding)SNMP消息相关的回调。该函数是非阻塞的,在同一时候它只处理突出的(outstanding)事件。
//------[ process pending events ]----------------------------------------------------------
int SNMPProcessPendingEvents();
当使用Snmp class操作的时候SNMP++提供了两种级别的错误(信息)。所有的Snmp class成员函数都返回一个状态值。“SNMP_CLASS_ERR_STATUS_SET”这个特别的错误值表明了Pdu发生了一个内部错误,必须用成员函数Pdu::get_error_status()来检索该错误(信息)。所有的SNMP++错误值都可传进成员函数Snmp::err_msg()以打印出该错误的文本描述。
SNMP++ General Errors |
Value |
Description
|
SNMP_CLASS_SUCCESS |
0 |
成功状态 |
SNMP_CLASS_ERROR |
-1 |
普通错误 |
SNMP_CLASS_RESOURCE_UNAVAIL |
-2 |
内存分配失败(New或malloc) |
SNMP_CLASS_INTERNAL_ERROR |
-3 |
未知的内部错误 |
SNMP_CLASS_UNSUPPORTED |
-4 |
不支持的函数 |
Callback Reasons |
|
|
SNMP_CLASS_TIMEOUT |
-5 |
明显的请求超时 |
SNMP_CLASS_ASYNC_RESPONSE |
-6 |
收到应答 |
SNMP_CLASS_NOTIFICATION |
-7 |
收到notification (trap/inform) |
SNMP_CLASS_SESSION_DESTROYED |
-8 |
销毁Snmp对象 |
Snmp Class Errors
|
|
|
SNMP_CLASS_INVALID |
-10 |
在无效的实例上调用了Snmp成员函数 |
SNMP_CLASS_INVALID_PDU |
-11 |
向映像函数传递了无效的PDU |
SNMP_CLASS_INVALID_TARGET |
-12 |
向映像函数传递了无效的target |
SNMP_CLASS_INVALID_CALLBACK |
-13 |
向映像函数传递了无效的回调函数 |
SNMP_CLASS_INVALID_REQID |
-14 |
要取消的请求ID无效 |
SNMP_CLASS_INVALID_NOTIFYID |
-15 |
trap/inform Oid丢失 |
SNMP_CLASS_INVALID_OPERATION |
-16 |
指定的target不允许进行Snmp操作 |
SNMP_CLASS_INVALID_OID |
-17 |
向映像函数传递了无效的Oid |
SNMP_CLASS_INVALID_ADDRESS |
-18 |
向映像函数传递了无效的address |
SNMP_CLASS_ERR_STATUS_SET |
-19 |
代理端返回带有错误信息的应答PDU |
SNMP_CLASS_TL_UNSUPPORTED |
-20 |
不支持的传输 |
SNMP_CLASS_TL_IN_USE |
-21 |
传输被占用 |
SNMP_CLASS_TL_FAILED |
-22 |
传输失败 |
当SNMP++的成员函数返回值是“SNMP_CLASS_ERR_STATUS_SET”时,可以由成员函数Pdu::get_error_status()获取一个额外的错误状态。该值表示的是RFC 1905中实际的SMI PDU错误状态值。这些值可以传进成员函数Snmp::err_msg()以友好(的方式)描述。
Pdu Error Status Macro
|
Value
|
Description |
SNMP_ERROR_TOO_BIG |
1 |
Pdu太大,查看错误索引 |
SNMP_ERROR_NO_SUCH_NAME |
2 |
没有对应的帮定变量名称,查看返回的错误索引 |
SNMP_ERROR_BAD_VALUE |
3 |
错误的帮定变量,查看返回的错误索引 |
SNMP_ERROR_READ_ONLY |
4 |
帮定变量是只读的,查看返回的错误索引 |
SNMP_ERROR_GENERAL_VB_ERR |
5 |
普通帮定变量错误,查看返回的错误索引 |
SNMP_ERROR_NO_ACCESS |
6 |
操作失败,拒绝访问 |
SNMP_ERROR_WRONG_TYPE |
7 |
操作失败,类型错误 |
SNMP_ERROR_WRONG_LENGTH |
8 |
操作失败,长度错误 |
SNMP_ERROR_WRONG_ENCODING |
9 |
操作失败,译码错误 |
SNMP_ERROR_WRONG_VALUE |
10 |
操作失败,值错误 |
SNMP_ERROR_NO_CREATION |
11 |
操作失败,拒绝创建 |
SNMP_ERROR_INCONSIST_VAL |
12 |
操作失败,值不相容 |
SNMP_ERROR_RESOURCE_UNAVAIL |
13 |
操作失败,无法使用资源 |
SNMP_ERROR_COMITFAIL |
14 |
操作失败,提交失败 |
SNMP_ERROR_UNDO_FAIL |
15 |
操作失败,撤销失败 |
SNMP_ERROR_AUTH_ERR |
16 |
操作失败,权限错误 |
SNMP_ERROR_NOT_WRITEABLE |
17 |
操作失败,拒绝更改 |
SNMP_ERROR_INCONSIS_NAME |
18 |
操作失败,名字不相容 |