1. 运行模式
SNMP++的设计(决定了它)支持多种运行模式。这些运行模式允许(用户)创建图形用户接口(GUI)以及控制台模式的应用。GUI运行模式与现有的GUI事件(驱动)系统协同工作;而控制台运行模式允许使用自定义的事件(驱动)系统,甚至不需要事件(驱动)系统。
1.1. Microsoft Windows事件(驱动)系统的运作
为了在MS-Windows上使用,SNMP++与MS-Windows消息系统协同工作。调用阻塞模式(可以)允许处理其他消息。
1.2. Open Systems Foundation (OSF) X11 Motif的运作
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);
1.3. 不以GUI为基础的应用的运作
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();
2. 状态&错误编号
当使用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 | 传输失败 |
3. 错误状态值
当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 | 操作失败,名字不相容 |