linux内核通信-netlink使用例子

合集下载

Netlink编程-用户主动发起会话

Netlink编程-用户主动发起会话

Netlink编程-用户主动发起会话Netlink是一种在内核态和用户态可以进行双向通信的机制,也就是说,用户进程既可以作为服务器端又可以作为客户端,内核也是如此。

用户进程和内核谁是服务器端谁是客户端,这个问题与谁先主动发起数据交互会话有关。

用户进程主动向内核发起会话在Linux内核中很常见,比如系统调用、对/proc的操作等。

本文通过详解一个简单的实例程序来说明用户进程通过netlink机制如何主动向内核发起会话。

在该程序中,用户进程向内核发送一段字符串,内核接收到后再将该字符串后再重新发给用户进程。

用户态程序netlink是一种特殊的套接字,在用户态除了一些参数的传递对其使用的方法与一般套接字无较大差异,。

1.宏与数据结构的定义在使用netlink进行用户进程和内核的数据交互时,最重要的是定义好通信协议。

协议一词直白的说就是用户进程和内核应该以什么样的形式发送数据,以什么样的形式接收数据。

而这个“形式”通常对应程序中的一个特定数据结构。

本文所演示的程序并没有使用netlink已有的通信协议,因此我们自定义一种协议类型NETLINK_TEST。

1 #define NETLINK_TEST 182 #define MAX_PAYLOAD 102434 struct req {5 struct nlmsghdr nlh;6 char buf[MAX_PAYLOAD];7 };除此之外,我们应该再自定义一个数据报类型req,该结构包含了netlink数据包头结构的变量nlh和一个MAX_PAYLOAD大小的缓冲区。

这里我们为了演示简单,并没有像上文中描述的那样将一个特定数据结构与nlmsghdr 封装起来。

2.创建netlink 套接字要使用netlink ,必须先创建一个netlink 套接字。

创建方法同样采用socket(),只是这里需要注意传递的参数:1int sock_fd; 2 sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST); 3if (sock_fd < 0) { 4 eprint(errno, "socket", __LINE__);5return errno; 6 } 第一个参数必须指定为PF_NETLINK 或AF_NETLINK 。

Netlink内核实现分析3

Netlink内核实现分析3

Netlink内核实现分析3Netlink IPC 数据结构#define NETLINK_ROUTE 0 /* Routing/device hook */#define NETLINK_UNUSED 1 /* Unused number */#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */#define NETLINK_SOCK_DIAG 4 /* socket monitoring */#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */#define NETLINK_XFRM 6 /* ipsec */#define NETLINK_SELINUX 7 /* SELinux event notifications */#define NETLINK_ISCSI 8 /* Open-iSCSI */#define NETLINK_AUDIT 9 /* auditing */#define NETLINK_FIB_LOOKUP 10#define NETLINK_CONNECTOR 11#define NETLINK_NETFILTER 12 /* netfilter subsystem */#define NETLINK_IP6_FW 13#define NETLINK_DNRTMSG 14 /* DECnet routing messages */#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */#define NETLINK_GENERIC 16/* leave room for NETLINK_DM (DM Events) */#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */#define NETLINK_ECRYPTFS 19#define NETLINK_RDMA 20#define NETLINK_CRYPTO 21 /* Crypto layer */#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG#define MAX_LINKS 32View Code/*其中(1)nl_family始终为AF_NETLINK;(2)nl_pad始终为0;(3)nl_pid为netlink套接字的单播地址,在发送消息时⽤于表⽰⽬的套接字的地址,在⽤户空间绑定时可以指定为当前进程的PID号(对于内核来说这个值为0)或者⼲脆不设置(在绑定bind时由内核调⽤netlink_autobind()设置为当前进程的PID),但需要注意的是当⽤户同⼀个进程中需要创建多个netlink套接字时则必须保证这个值是唯⼀的(⼀般在多线程中可以使⽤”pthread_self() << 16 | getpid()“这样的⽅法进⾏设置);(4)nl_groups表⽰组播组。

NetLink使用实例(YGM)

NetLink使用实例(YGM)

如何使用Netlink Connector Author: Yang gongming简介:本文详细介绍了 Linux 2.6.34.14 内核引入的内核空间与用户空间通信的新机制连接器,并通过典型示例讲解了它的使用。

一、概述连接器是一种新的用户态与内核态的通信方式,它使用起来非常方便。

本质上,连接器是一种netlink,它的 netlink 协议号为 NETLINK_CONNECTOR,与一般的 netlink 相比,它提供了更容易的使用接口,使用起来更方便。

netlink本质上是socket,不过它可用于用户程序和内核程序的通信。

1.内核模块使用方法注册一个标识 ID 和回调函数,即可使用连接器。

cn_msg结构://标识netlink的IDstruct cb_id{__u32 idx;__u32 val;};//netlink控制信息头struct cn_msg{struct cb_id id;__u32 seq;__u32 ack;__u32 len;/* Length of the following data */__u8 data[0];};三个内核模块常用的API。

int cn_add_callback(struct cb_id *id, char *name, void (*callback) (void *));void cn_del_callback(struct cb_id *id);void cn_netlink_send(struct cn_msg *msg, u32 __group, int gfp_mask);结构 cb_id 是连接器实例的标识 ID,它用于确定 netlink 消息与回调函数的对应关系。

当连接器接收到标识 ID 为 {idx,val} 的 netlink 消息时,注册的回调函数 void (*callback) (void *) 将被调用。

该回调函数的参数为结构struct cn_msg 的指针。

用户空间和内核空间通讯之【Netlink下】

用户空间和内核空间通讯之【Netlink下】

用户空间和内核空间通讯之【Netlink下】在上一篇博文中我们所遇到的情况都是用户空间作为消息进程的发起者,Netlink还支持内核作为消息的发送方的情况。

这一般用于内核主动向用户空间报告一些内核状态,例如我们在用户空间看到的USB的热插拔事件的通告就是这样的应用。

先说一下我们的目标,内核线程每个一秒钟往一个多播组里发送一条消息,然后用户空间所以加入了该组的进程都会收到这样的消息,并将消息内容打印出来。

Netlink地址结构体中的nl_groups是32位,也就是说每种Netlink协议最多支持32个多播组。

如何理解这里所说的每种Netlink 协议?在</usr/include/linux/netlink.h>里预定义的如下协议都是Netlink协议簇的具体协议,还有我们添加的NETLINK_TEST也是一种Netlink协议。

1.#define NETLINK_ROUTE 0 /*Routing/device hook */2.#define NETLINK_UNUSED 1 /*Unused number */3.#define NETLINK_USERSOCK 2 /*Reserved for user mode socket protocols */4.#define NETLINK_FIREWALL 3 /*Firewalling hook */5.#define NETLINK_INET_DIAG 4 /*INET socket monitoring */6.#define NETLINK_NFLOG 5 /*netfilter/iptables ULOG */7.#define NETLINK_XFRM 6 /* ipsec */8.#define NETLINK_SELINUX 7 /*SELinux event notifications */9.#define NETLINK_ISCSI 8 /* Open-iSCSI */10.#define NETLINK_AUDIT 9 /* auditing */11.#define NETLINK_FIB_LOOKUP 1012.#define NETLINK_CONNECTOR 1113.#define NETLINK_NETFILTER 12 /*netfilter subsystem */14.#define NETLINK_IP6_FW 1315.#define NETLINK_DNRTMSG 14 /*DECnet routing messages */16.#define NETLINK_KOBJECT_UEVENT 15 /*Kernel messages to userspace */17.#define NETLINK_GENERIC 1618./* leave room for NETLINK_DM (DM Events)*/19.#define NETLINK_SCSITRANSPORT 18 /*SCSI Transports */20.#define NETLINK_ECRYPTFS 1921.#define NETLINK_TEST 20 /* 用户添加的自定义协议 */在我们自己添加的NETLINK_TEST协议里,同样地,最多允许我们设置32个多播组,每个多播组用1个比特表示,所以不同的多播组不可能出现重复。

Netlink套接字在Linux系统通信中的应用研究

Netlink套接字在Linux系统通信中的应用研究
d ti| e al
Ke r s N t n o k t y t m o y wo d : e l k s e ;s se c mmu iai n P i c nc t ;I C o
0 引 言
’不能用在硬 、 软中断中, 只能由用户方主动发起通信 , 内核 不能主 动向用 户 进 程 写数 据 。这 种 通 信 方式 比 Ln x 作 系 统 作 为 目前 最 流 行 的 开 源 操 作 系 较适 用于读 写硬件 系统驱 动程序 的参 数 。 iu 操 ( ) rc 2 pof 口。虚 拟 文 件 系统 , 常 挂 接 在/ s接 通 统, 为许 多硬 软件 产品 的开发 提供 了 良好 的平 台。开 rc目录下 , 内核通过 文件 形式将 内部 信息展 现 给用 发 者可对 内核进行 裁减 和修 改 , 制最适合 的操作 系 po 定 户空 间进程 , 创建这 些文件 的 内核模 块规定用 户 空 间 统平台, 并在 此基 础 之 上进 行 用 户 应用 程 序 的开 发 。 po Lnx为用 户 进 程 和 内核 进 程 的通 信 提 供 了 多种 方 的文件访 问权 限。/ rc目录对 于用户 空 间是 不可 写 iu
中 图分 类 号 :P l T 3
文献 标 识 码 : A
Re e r h o p ia in o t n o k ti i u y t m mm u i t n s a c n Ap l t fNel k S c e L n x S se Co c o i n nc i a o
维普资讯
20 07年第 3期
计 算 机 与 现 代 化 J U N IY I N AHU I A J U XA D I A S
总 第 19期 3
文 章 编 号 :0 62 7 ( 07 0 -190 10 -4 5 2 0 )300 - 3

netlink

netlink

netlink socket编程why & how作者: Kevin Kaichuan He@2005-1-5翻译整理:duanjigang @2008-9-15<duanjigang1983@>原文:/article/7356开发和维护内核是一件很繁杂的工作,因此,只有那些最重要或者与系统性能息息相关的代码才将其安排在内核中。

其它程序,比如GUI,管理以及控制部分的代码,一般都会作为用户态程序。

在linux系统中,把系统的某个特性分割成在内核中和在用户空间中分别实现一部分的做法是很常见的(比如linux系统的防火墙就分成了内核态的Netfilter和用户态的iptables)。

然而,内核程序与用户态的程序又是怎样行通讯的呢?答案就是通过各种各样的用户态和内核态的IPC(interprocess communication )机制来实现。

比如系统调用,ioctl接口,proc文件系统以及netlink socket,本文就是要讨论netlink socekt并向读者展示这种用网络通讯接口方式实现的IPC机制的优点。

介绍:netlink socekt是一种用于在内核态和用户态进程之间进行数据传输的特殊的IPC。

它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket 接口的方式,实现了一种全双工的通讯连接。

类似于TCP/IP中使用AF_INET地址族一样,netlink socket使用地址族AF_NETLINK。

每一个netlink socket在内核头文件include/linux/netlink.h中定义自己的协议类型。

下面是netlink socket 目前的特性集合以及它支持的协议类型:¾NETLINK_ROUTE: 用户空间的路由守护程序之间的通讯通道,比如BGP,OSPF,RIP以及内核数据转发模块。

用户态的路由守护程序通过此类型的协议来更新内核中的路由表。

Linux用户态与内核态的交互

Linux用户态与内核态的交互

Linux 用户态与内核态的交互Linux用户态与内核态的交互2010-06-13 22:30Linux用户态与内核态的交互在Linux 2.4版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用netlink套接字实现的,例如iprote2网络管理工具,它与内核的交互就全部使用了netlink,著名的内核包过滤框架Netfilter在与用户空间的通读,也在最新版本中改变为netlink,无疑,它将是Linux用户态与内核态交流的主要方法之一。

它的通信依据是一个对应于进程的标识,一般定为该进程的ID。

当通信的一端处于中断过程时,该标识为0。

当使用netlink套接字进行通信,通信的双方都是用户态进程,则使用方法类似于消息队列。

但通信双方有一端是中断过程,使用方法则不同。

netlink套接字的最大特点是对中断过程的支持,它在内核空间接收用户空间数据时不再需要用户自行启动一个内核线程,而是通过另一个软中断调用用户事先指定的接收函数。

《UNIX Network Programming Volume 1-3rd Edition》第18章讲到BSD UNIX系统中routing socket的应用,这种套接字是按下面方式生成的:rt_socket=socket(AF_ROUTE,SOCK_RAW,0);然后就可以用它跟内核交互,进行网络环境管理的操作,如读取/设置/删除路由表信息,更改网关等等,但书中所列代码只在4.3BSD及以后版本的原始UNIX系统下可用,Linux虽然实现了AF_ROUTE族套接字,但用法却完全不同。

由于网上这方面知识的资料想对匮乏,现对Linux下routing socket的使用做一介绍。

由于我现在在MagicLinux1.0下工作,所以以下的讲解全部基于2.4.10内核。

Linux从v2.2开始引入这一机制,因此可以肯定从v2.2到v2.4的内核都是适用的,更新的v2.6我没有试过。

linux中link用法

linux中link用法

linux中link用法摘要:1.Linux 中的link 是什么2.link 的基本用法3.link 的参数及用法详解4.link 的实际应用举例5.总结正文:【1.Linux 中的link 是什么】在Linux 系统中,link 是一种用于创建文件或目录的快捷方式的命令。

它可以为文件或目录创建一个链接,使得用户可以通过该链接快速地访问原始文件或目录,而不需要记住其具体的路径。

【2.link 的基本用法】link 命令的基本用法如下:```link [选项] 源文件或目录目标文件或目录```其中,源文件或目录是要创建链接的文件或目录,目标文件或目录是链接所指向的文件或目录。

【3.link 的参数及用法详解】link 命令支持以下参数:- -s:创建软链接,即创建一个指向源文件或目录的快捷方式。

软链接的特点是,当源文件或目录被删除时,软链接也会失效。

- -h:创建硬链接,即创建一个与源文件或目录相同的文件或目录。

硬链接的特点是,当源文件或目录被删除时,硬链接仍然可以访问原始内容。

- -v:显示详细信息,用于显示创建的链接的详细信息。

【4.link 的实际应用举例】例1:创建一个指向文件的软链接```link -s source.txt link_to_source.txt```执行以上命令后,会在当前目录下创建一个名为“link_to_source.txt”的文件,它指向“source.txt”。

例2:创建一个指向文件的硬链接```link -h source.txt link_to_source.txt```执行以上命令后,会在当前目录下创建一个名为“link_to_source.txt”的文件,它与“source.txt”指向同一个内容。

例3:创建一个指向目录的软链接```link -s dir1 link_to_dir1```执行以上命令后,会在当前目录下创建一个名为“link_to_dir1”的目录,它指向“dir1”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Netlink 是一种特殊的socket,它是Linux 所特有的,类似于BSD 中的AF_ROUTE 但又远比它的功能强大,目前在最新的Linux 内核(2.6.14)中使用netlink 进行应用与内核通信的应用很多,包括:路由daemon (NETLINK_ROUTE),1-wire 子系统(NETLINK_W1),用户态socket 协议(NETLINK_USERSOCK),防火墙(NETLINK_FIREWALL),socket 监视(NETLINK_INET_DIAG),netfilter 日志(NETLINK_NFLOG),ipsec 安全策略(NETLINK_XFRM),SELinux 事件通知(NETLINK_SELINUX),iSCSI 子系统(NETLINK_ISCSI),进程审计(NETLINK_AUDIT),转发信息表查询(NETLINK_FIB_LOOKUP),netlinkconnector(NETLINK_CONNECTOR),netfilter 子系统(NETLINK_NETFILTER),IPv6 防火墙(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),内核事件向用户态通知(NETLINK_KOBJECT_UEVENT),通用netlink (NETLINK_GENERIC)。

Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的socket API 就可以使用netlink 提供的强大功能,内核态需要使用专门的内核API 来使用netlink。

Netlink 相对于系统调用,ioctl 以及/proc 文件系统而言具有以下优点:1,为了使用netlink,用户仅需要在include/linux/netlink.h 中增加一个新类型的netlink 协议定义即可,如#define NETLINK_MYTEST 17 然后,内核和用户态应用就可以立即通过socket API 使用该netlink 协议类型进行数据交换。

但系统调用需要增加新的系统调用,ioctl 则需要增加设备或文件,那需要不少代码,proc 文件系统则需要在/proc 下添加新的文件或目录,那将使本来就混乱的/proc 更加混乱。

2. netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中,发送消息只是把消息保存在接收者的socket的接收队列,而不需要等待接收者收到消息,但系统调用与ioctl 则是同步通信机制,如果传递的数据太长,将影响调度粒度。

3.使用netlink 的内核部分可以采用模块的方式实现,使用netlink 的应用部分和内核部分没有编译时依赖,但系统调用就有依赖,而且新的系统调用的实现必须静态地连接到内核中,它无法在模块中实现,使用新系统调用的应用在编译时需要依赖内核。

4.netlink 支持多播,内核模块或应用可以把消息多播给一个netlink组,属于该neilink 组的任何内核模块或应用都能接收到该消息,内核事件向用户态的通知机制就使用了这一特性,任何对内核事件感兴趣的应用都能收到该子系统发送的内核事件,在后面的文章中将介绍这一机制的使用。

5.内核可以使用netlink 首先发起会话,但系统调用和ioctl 只能由用户应用发起调用。

6.netlink 使用标准的socket API,因此很容易使用,但系统调用和ioctl则需要专门的培训才能使用。

用户态使用netlink用户态应用使用标准的socket APIs,socket(), bind(), sendmsg(), recvmsg() 和close() 就能很容易地使用netlink socket,查询手册页可以了解这些函数的使用细节,本文只是讲解使用netlink 的用户应该如何使用这些函数。

注意,使用netlink 的应用必须包含头文件linux/netlink.h。

当然socket 需要的头文件也必不可少,sys/socket.h。

为了创建一个netlink socket,用户需要使用如下参数调用socket():socket(AF_NETLINK, SOCK_RAW, netlink_type)第一个参数必须是AF_NETLINK 或PF_NETLINK,在Linux 中,它们俩实际为一个东西,它表示要使用netlink,第二个参数必须是SOCK_RAW或SOCK_DGRAM,第三个参数指定netlink协议类型,如前面讲的用户自定义协议类型NETLINK_MYTEST,NETLINK_GENERIC是一个通用的协议类型,它是专门为用户使用的,因此,用户可以直接使用它,而不必再添加新的协议类型。

内核预定义的协议类型有:#define NETLINK_ROUTE 0 /* Routing/device hook */ #define NETLINK_W1 1 /* 1-wire subsystem */ #define NETLINK_USERSOCK 2 /* Reserved for user modesocket protocols */#define NETLINK_FIREWALL 3 /* Firewalling hook */#define NETLINK_INET_DIAG 4 /* INET socket monitoring */ #define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */#define NETLINK_XFRM 6 /* ipsec */#define NETLINK_SELINUX 7 /* SELinux event notifications */ #define NETLINK_ISCSI 8 /* Open-iSCSI */#define NETLINK_AUDIT 9 /* auditing */#define NETLINK_FIB_LOOKUP 10#define NETLINK_CONNECTOR 11#define NETLINK_NETFILTER 12 /* netfilter subsystem */#define NETLINK_IP6_FW 13#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ #define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages touserspace */#define NETLINK_GENERIC 16对于每一个netlink协议类型,可以有多达32多播组,每一个多播组用一个位表示,netlink 的多播特性使得发送消息给同一个组仅需要一次系统调用,因而对于需要多拨消息的应用而言,大大地降低了系统调用的次数。

函数bind() 用于把一个打开的netlink socket 与netlink 源socket 地址绑定在一起。

netlink socket 的地址结构如下:struct sockaddr_nl{sa_family_t nl_family;unsigned short nl_pad;__u32 nl_pid;__u32 nl_groups;};字段nl_family 必须设置为AF_NETLINK 或着PF_NETLINK,字段nl_pad 当前没有使用,因此要总是设置为0,字段nl_pid 为接收或发送消息的进程的ID,如果希望内核处理消息或多播消息,就把该字段设置为0,否则设置为处理消息的进程ID。

字段nl_groups 用于指定多播组,bind 函数用于把调用进程加入到该字段指定的多播组,如果设置为0,表示调用者不加入任何多播组。

传递给bind 函数的地址的nl_pid 字段应当设置为本进程的进程ID,这相当于netlink socket 的本地地址。

但是,对于一个进程的多个线程使用netlink socket 的情况,字段nl_pid 则可以设置为其它的值,如:pthread_self() << 16 | getpid();因此字段nl_pid 实际上未必是进程ID,它只是用于区分不同的接收者或发送者的一个标识,用户可以根据自己需要设置该字段。

函数bind 的调用方式如下:bind(fd, (struct sockaddr*)&nladdr, sizeof(struct sockaddr_nl));fd为前面的socket 调用返回的文件描述符,参数nladdr 为struct sockaddr_nl 类型的地址。

为了发送一个netlink 消息给内核或其他用户态应用,需要填充目标netlink socket 地址,此时,字段nl_pid 和nl_groups 分别表示接收消息者的进程ID 与多播组。

如果字段nl_pid 设置为0,表示消息接收者为内核或多播组,如果nl_groups为0,表示该消息为单播消息,否则表示多播消息。

使用函数sendmsg 发送netlink 消息时还需要引用结构struct msghdr、struct nlmsghdr 和struct iovec,结构struct msghdr 需如下设置:struct msghdr msg;memset(&msg, 0, sizeof(msg));msg.msg_name = (void *)&(nladdr);msg.msg_namelen = sizeof(nladdr);其中nladdr 为消息接收者的netlink 地址。

struct nlmsghdr 为netlink socket 自己的消息头,这用于多路复用和多路分解netlink 定义的所有协议类型以及其它一些控制,netlink 的内核实现将利用这个消息头来多路复用和多路分解已经其它的一些控制,因此它也被称为netlink 控制块。

因此,应用在发送netlink 消息时必须提供该消息头。

struct nlmsghdr{__u32 nlmsg_len; /* Length of message */__u16 nlmsg_type; /* Message type*/__u16 nlmsg_flags; /* Additional flags */__u32 nlmsg_seq; /* Sequence number */__u32 nlmsg_pid; /* Sending process PID */};字段nlmsg_len 指定消息的总长度,包括紧跟该结构的数据部分长度以及该结构的大小,字段nlmsg_type 用于应用内部定义消息的类型,它对netlink 内核实现是透明的,因此大部分情况下设置为0,字段nlmsg_flags 用于设置消息标志,可用的标志包括:/* Flags values */#define NLM_F_REQUEST 1 /* It is request message. */ #define NLM_F_MULTI 2 /* Multipart message, terminatedby NLMSG_DONE */#define NLM_F_ACK 4 /* Reply with ack, with zero orerror code */#define NLM_F_ECHO 8 /* Echo this request *//* Modifiers to GET request */#define NLM_F_ROOT 0x100 /* specify tree root */#define NLM_F_MATCH 0x200 /* return all matching */#define NLM_F_ATOMIC 0x400 /* atomic GET */#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH)/* Modifiers to NEW request */#define NLM_F_REPLACE 0x100 /* Override existing */#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */#define NLM_F_CREATE 0x400 /* Create, if it does not exist */#define NLM_F_APPEND 0x800 /* Add to end of list */标志NLM_F_REQUEST用于表示消息是一个请求,所有应用首先发起的消息都应设置该标志。

相关文档
最新文档