目的是针对收发信息时出现的不同情况,调用预先设置好的回调函数进行处理。以下均以回调角度对照原注释说明。
enum nl_cb_type {
/** Message is valid */
0 NL_CB_VALID, 5 接收的消息类型没有这些标志时
/** Last message in a series of multi part messages received */
1 NL_CB_FINISH, 5 接收的消息类型是NLMSG_DONE时,多部分消息中的最后一个
/** Report received that data was lost */
2 NL_CB_OVERRUN, 5 接收的消息类型是NLMSG_OVERRUN时,消息数据丢失
/** Message wants to be skipped */
3 NL_CB_SKIPPED, 5 接收的消息类型是NLMSG_NOOP时,对方要求忽略
/** Message is an acknowledge */
4 NL_CB_ACK, 5 接收的消息类型是NLMSG_ERROR时,对方要求ACK
/** Called for every message received */
5 NL_CB_MSG_IN, 1 刚收到的看似好的信息时
/** Called for every message sent out except for nl_sendto() */
6 NL_CB_MSG_OUT,
/** Message is malformed and invalid */
7 NL_CB_INVALID, 在消息类型为NLMSG_ERROR时,可能也会被调用。
/** Called instead of internal sequence number checking */
8 NL_CB_SEQ_CHECK, 2 检查序号。内部回调如出错会回调NL_CB_INVALID
/** Sending of an acknowledge message has been requested */
9 NL_CB_SEND_ACK, 4 接收的消息中有NLM_F_ACK标志时,对方要求ACK
/** Flag NLM_F_DUMP_INTR is set in message */
10 NL_CB_DUMP_INTR, 3 接收的消息中有这个标志时,大概是传过来的数据有问题
__NL_CB_TYPE_MAX,
};
NL_CB_MSG_OUT在发送信息前回调(均于nl_sendmsg)。其它均针对的是接收信息(均于recvmsgs)时的情况。
注意:
顺序号是相对于一次收发请求/应答而言的,即在这一次请求中,不论消息由多少个组成,均使用同一个顺序号。
内核主动发出的消息/广播,顺序号为0。因此用户这时不能进行顺序号检查。
针对收发信息的不同类型,如NL_CB_VALID、NL_CB_FINISH、NL_CB_MSG_OUT等,libnl均提供了4种默认实现,其中:
socket初始分配时,根据程序运行时的环境变量,选择设置前三种之一的回调集合;未设置环境变量时,选择quiet模式,即回函数使用的是NL_CB_DEFAULT集,也就是都是空指针,没有回调。NL_CB_CUSTOM供定制回调。
应用程序可以通过nl_cb_alloc新建前三种之一的回调集合。
绑定到socket的回调一经设置,不做专门调整,将一直起作用,除非收发时使用了带指定回调接口的方法。
由nl_cb_err等方法设置,用于专门处理内核发过来的带NLMSG_ERROR标志的信息。
定制socket的回调函数。其中:
当kind为NL_CB_CUSTOM时,就是正常理解上的定制;否则是恢复相应模式对此类信息的默认处理函数,并设置参数,即func会被忽略。
如果不传递错误的type、kind参数,此函数不可能返回错误值。
nl_cb_set与其类似,只是不绑定socket。
新建指定类别(模式)的回调函数集,包括错误处理回调函数。前三种模式为使用系统的默认实现,第4种均为空指针;所有模式参数均为空指针。
引用计数置为1。
函数原型:
struct nl_cb *nl_cb_get(struct nl_cb *cb)//增加cb的引用计数,并返回它
struct nl_cb *nl_socket_get_cb(const struct nl_sock *sk)//获取socket的回调集,并增加其引用计数
void nl_cb_put(struct nl_cb *cb)//减少引用计数,如为0则释放它
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。