基于netlink的内核态与用户态异步并发消息处理模型 下载本文

内容发布更新时间 : 2024/5/17 18:54:43星期一 下面是文章的全部内容请认真阅读。

基于netlink的内核态与用户态异步并发消息处理模型

用户态采用select模型,初始化时建立多个

netlinksocket,绑定完成之后,向内核发送握手消息,这样内核可以将已经建立的连接记住,以便后续选择可用的连接发送数据。初始化和握手完成之后,由内核主动向用户态发送数据,用户态主线程在各个socket句柄上面等待读事件的到来,当检测到读事件时,向线程池提交数据读取和处理任务。这样模拟一个连接池和事件分发模型,保证内核数据及时被读取到用户态程序并处理,能做到并发。

而内核态的netlink在接收数据时本身就是以系统调用的方式提供给业务层的发送接口,因此本身就是异步的,性能不是问题。内核态收到数据时,只需要提交给一个内核线程去处理即可。

原型代码如下:共用头文件

#define NETLINK_TEST 21

#define MAX_DATA_LEN (768)#define

MAX_PROCESS_COUNT 100#define MAX_PAYLOAD 1024 #define MAX_PID_COUNT MAX_PROCESS_COUNT #define MAX_REC_DATA_LEN 1024#define STATIC_PEROID 1024*500#define MSG_COUNT

10000#define TRUE 1用户态 #include #include #include #include #include #include #include

#include asm/types.h> #include #include #include #include

#include \{

unsigned int pid;

struct sockaddr_nl src_addr; struct sockaddr_nl dest_addr; int sock_fd; struct msghdr msg;

} *endpoits = NULL;int listen_user(void);

int handwithknl(void); int close_user(void);

int doselect(struct timeval wait); void* threadProc(void* ed); void* sendThreadProc(void* arg); void flushcount(int len); void staticsout(void); void startSendThreads(void); static int maxfd = 0; static fd_set rset;

static struct timeval tmout;unsigned char* readbuffer;static struct timeval tmnow; static struct timeval oldtime;

static long reccount = 0;pthread_mutex_t mutex; static long readbytes = 0; static long readnum = 0;

static long sendbytes = 0;int main(int argc, char* argv[]) {

endpoits = (struct endpoint*)malloc(sizeof(struct endpoint) * MAX_PID_COUNT); readbuffer = (unsigned

char*)malloc(MAX_REC_DATA_LEN); // create an netlink socket and bind.