用libevent多线程方式实现echo server
来源:互联网 发布:巫师三优化 编辑:程序博客网 时间:2024/05/19 19:33
from http://blog.chinaunix.net/uid-756931-id-353296.html
功能:
功能:
主线程同时监听定时器事件和IO事件,工作线程简单的监听IO事件。
主线程每隔一秒种向工作线程发送一条字符串信息
工作线程显示该信息并回显给主线程
该示例演示了主线程如何同时监听多个事件。
Makefile
- eventtest : eventtest.c
- gcc -Wall -g -levent -lpthread -o eventtest eventtest.c
- .PHONY : clean
- clean :
- rm eventtest -f
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <sys/types.h> #include <sys/socket.h> #include <event.h> struct event_base *workerbase; int fd[2]; static void thread_libevent_process(int fd, short which, void *arg) { int ret; char buf[128]; ret = read(fd, buf, 128); if (ret > 0) { buf[ret] = '\0'; printf("thread receive message : %s\n", buf); } sleep(1); write(fd, buf, ret); return; } static void * worker_thread(void *arg) { int fd = *(int *)arg; struct event ev; event_set(&ev, fd, EV_READ | EV_PERSIST, thread_libevent_process, NULL); event_base_set(workerbase, &ev); event_add(&ev, 0); event_base_loop(workerbase, 0); return NULL; } static void main_event_process(int fd, short which, void *arg) { int ret; char buf[128]; ret = read(fd, buf, 128); if (ret > 0) { buf[ret]='\0'; printf("main thread receive echo message : %s\n", buf); } return; } static void timeout_cb(int fdd, short event, void *arg) { struct timeval tv; struct event *timeout = arg; write(fd[0], "Hello world!", sizeof("Hello world!") - 1); evutil_timerclear(&tv); tv.tv_sec = 1; event_add(timeout, &tv); } int main (int argc, char *argv[]) { int ret; pthread_t tid; struct event ev; struct event evtimeout; struct timeval tv; struct event_base *base; base = event_init(); if (base == NULL) { perror("event_init( base )"); return 1; } workerbase = event_init(); if (workerbase == NULL) { perror("event_init( workerbase )"); return 1; } ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, fd); if (ret == -1) { perror("socketpair() : "); return 1; } event_set(&ev, fd[0], EV_READ | EV_PERSIST, main_event_process, NULL); event_base_set(base, &ev); event_add(&ev, 0); evtimer_set(&evtimeout, timeout_cb, &evtimeout); event_base_set(base, &evtimeout); evutil_timerclear(&tv); tv.tv_sec = 1; event_add(&evtimeout, &tv); ret = pthread_create(&tid, NULL, worker_thread, (void *)&fd[1]); if (ret != 0) { perror("pthread_create()"); return 1; } event_base_loop(base, 0); return 0; }
0 0
- 用libevent多线程方式实现echo server
- 使用libevent:echo server
- 另一个用libevent实现的echo服务器
- libevent入门教程:Echo Server based on libevent
- libevent入门教程:Echo Server based on libevent
- libevent入门教程:Echo Server based on libevent
- libevent入门教程:Echo Server based on libevent
- libevent入门教程:Echo Server based on libevent
- libevent入门教程:Echo Server based on libevent
- libevent入门教程:Echo server based on libevent
- libevent入门教程:Echo Server based on libevent
- Libevent:Echo Server Based on libevent
- libevent代码例子---- echo server
- libevent for echo server and client
- libevent for echo server and client
- libevent (1) 入门教程:Echo Server based on libevent
- libevent 入门教程:Echo Server based on libevent(转)
- libevent(2) : 用libevent改写server端 实现echo_server
- uboot移植与源码分析总结(3)-Serial驱动分析
- Mongoose源码分析:外篇之web服务器
- 关于如何打开谷歌的电脑设置方法
- Mongoose源码分析:Intoduction and Installation
- [C] sizeof居然不是函数是运算符
- 用libevent多线程方式实现echo server
- JAVA基础----java中E,T,?的区别?
- Mongoose源码分析:数据结构篇
- LeetCode:Regular Expression Matching
- Java exec jar
- Mongoose源码分析:mongoose的工作模型
- Mongoose源码剖析:核心处理模块
- TCP&UDP差异对比
- 7 如何检查一个数字是不是2的乘方