Linux网络编程——libevent库Hello World程序 以你之姓@ 2022-09-04 09:48 142阅读 0赞 # libevent介绍 # 1 事件驱动, 高性能, 轻量级, 专注于网络 2 源代码精炼, 易读 3 跨平台 4 支持多种I/O多路复用技术, 如epoll select poll等 5 支持I/O和信号等事件 # 安装 # 登录官方网站: http://libevent.org, 查看相关信息 libevent源码下载主要分2个大版本: 1. 1.4.x 系列, 较为早期版本, 适合源码学习 2. 2.x系列, 较新的版本, 代码量比1.4版本多很多, 功能也更完善。 libevent的核心实现: 在linux上, 其实质就是epoll反应堆. libevent是事件驱动, epoll反应堆也是事件驱动, 当要监测的事件发生的时候, 就会调用事件对应的回调函数, 执行相应操作. 特别提醒: 事件回调函数是由用户开发的, 但是不是由用户显示去调用的, 而是由libevent去调用的. 从官网http://libevent.org上下载安装文件之后, 将安装文件上传到linux系统上;源码包的安装,以2.0.22版本为例,在官网可以下载到源码包libevent-2.0.22-stable.tar.gz, 安装步骤与第三方库源码包安装方式基本一致。 # 安装编译工具 sudo apt-get update sudo apt-get install build-essential gdb # 看安装说明 tax -zxvf libevent-2.0.22-stable.tar.gz # cd到libevent-2.0.22-stable目录下, 查看README文件, # 该文件里描述了安装的详细步骤, 可参照这个文件进行安装 cd libevent-2.0.22-stable # 生成makefile ./configure # 执行make命令编译整个项目文件 make # 执行sudo make install进行安装 sudo make install # 代码 # 进入到libevent-2.0.22-stable/sample下, 可以查看一些示例源代码文件. 使用libevent库编写代码在编译程序的时候需要指定库名:-levent; 安装文件的libevent库文件所在路径:`libevent-2.0.22-stable/.libs`; 编写代码的时候用到event.h头文件, 或者直接参考sample目录下的源代码文件也可以. #include <event2/event.h> 编译源代码文件(以hello-world.c文件为例) gcc hello-world.c -levent 由于安装的时候已经将头文件和库文件拷贝到了系统头文件所在路径/usr/local/include和系统库文件所在路径/usr/local/lib, 所以这里编译的时候可以不用指定-I和-L. 编译示例代码hello-world.c程序: gcc -o hello-world hello-world.c -levent 测试: 在另一个终端窗口进行测试, 输入: `nc 127.1 9995`, 然后回车立刻显示`Hello, World!`字符串. /* T his exmple program provides a trivial server program that listens for TCP connections on port 9995. When they arrive, it writes a short message to each client connection, and closes each connection once it is flushed. 此示例程序提供了一个普通的服务器程序,用于侦听端口9995上的TCP连接。当TCP连接到达时,它会向每个客户端连接写入一条短消息,并在刷新后关闭每个连接 Where possible, it exits cleanly in response to a SIGINT (ctrl-c). 在可能的情况下,它干净地退出以响应SIGINT */ #include <string.h> #include <errno.h> #include <stdio.h> #include <signal.h> #ifndef WIN32 #include <netinet/in.h> # ifdef _XOPEN_SOURCE_EXTENDED # include <arpa/inet.h> # endif #include <sys/socket.h> #endif #include <event2/bufferevent.h> #include <event2/buffer.h> #include <event2/listener.h> #include <event2/util.h> #include <event2/event.h> static const char MESSAGE[] = "Hello, World!\n"; static const int PORT = 9995; static void listener_cb(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *); static void conn_writecb(struct bufferevent *, void *); static void conn_eventcb(struct bufferevent *, short, void *); static void signal_cb(evutil_socket_t, short, void *); int main(int argc, char **argv) { struct event_base *base; struct evconnlistener *listener; struct event *signal_event; struct sockaddr_in sin; #ifdef WIN32 WSADATA wsa_data; WSAStartup(0x0201, &wsa_data); #endif base = event_base_new(); if (!base) { fprintf(stderr, "Could not initialize libevent!\n"); return 1; } memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(PORT); listener = evconnlistener_new_bind(base, listener_cb, (void *)base, LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1, (struct sockaddr*)&sin, sizeof(sin)); if (!listener) { fprintf(stderr, "Could not create a listener!\n"); return 1; } signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)base); if (!signal_event || event_add(signal_event, NULL)<0) { fprintf(stderr, "Could not create/add a signal event!\n"); return 1; } event_base_dispatch(base); evconnlistener_free(listener); event_free(signal_event); event_base_free(base); printf("done\n"); return 0; } static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *user_data) { struct event_base *base = user_data; struct bufferevent *bev; bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); if (!bev) { fprintf(stderr, "Error constructing bufferevent!"); event_base_loopbreak(base); return; } bufferevent_setcb(bev, NULL, conn_writecb, conn_eventcb, NULL); bufferevent_enable(bev, EV_WRITE); bufferevent_disable(bev, EV_READ); bufferevent_write(bev, MESSAGE, strlen(MESSAGE)); } static void conn_writecb(struct bufferevent *bev, void *user_data) { struct evbuffer *output = bufferevent_get_output(bev); if (evbuffer_get_length(output) == 0) { printf("flushed answer\n"); bufferevent_free(bev); } } static void conn_eventcb(struct bufferevent *bev, short events, void *user_data) { if (events & BEV_EVENT_EOF) { printf("Connection closed.\n"); } else if (events & BEV_EVENT_ERROR) { printf("Got an error on the connection: %s\n", strerror(errno));/*XXX win32*/ } /* None of the other events can happen here, since we haven't enabled * timeouts */ bufferevent_free(bev); } static void signal_cb(evutil_socket_t sig, short events, void *user_data) { struct event_base *base = user_data; struct timeval delay = { 2, 0 }; printf("Caught an interrupt signal; exiting cleanly in two seconds.\n"); event_base_loopexit(base, &delay); }
相关 Java编程入门:简单Hello World程序详解 在Java编程入门阶段,"Hello World"程序是第一个要理解和编写的例子。下面详细解释一下这个程序: 1. **程序结构**: ```java public clas ﹏ヽ暗。殇╰゛Y/ 2024年09月11日 18:39/ 0 赞/ 6 阅读
相关 Linux网络编程(七)-第三方库-Libevent01:安装Libevent【Ubuntu20.04】 一、安装 验证是否已经安装Libevent [weblogic@localhost opt]$ ls -al /usr/lib | grep libevent 朴灿烈づ我的快乐病毒、/ 2023年09月25日 12:22/ 0 赞/ 16 阅读
相关 hello world_Hello World CGI hello world A CGI script can be as simple or complex as you need it to be. It could be 旧城等待,/ 2022年12月06日 15:23/ 0 赞/ 253 阅读
相关 Linux网络编程——libevent库Hello World程序 libevent介绍 1 事件驱动, 高性能, 轻量级, 专注于网络 2 源代码精炼, 易读 3 跨平台 4 支持多种I/O多路复用技术, 如epoll se 以你之姓@/ 2022年09月04日 09:48/ 0 赞/ 143 阅读
相关 Linux 模块编程-hello world 的准备工作 Linux运行时分为用户空间和内核空间两个部分。这个有点儿现在的体制内和体制外的区别,同时运行,但是运行的环境和所使用的规则不一样。用户空间运行的叫程序(APP),都有个 r囧r小猫/ 2022年08月11日 10:28/ 0 赞/ 130 阅读
相关 linux内核编程(hello world示例程序) linux内核编程(hello world) > Linux可加载内核模块是 Linux 内核的最重要创新之一。它们提供了可伸缩的、动态的内核。其它开发者可以不用重新编译 男娘i/ 2022年06月18日 12:17/ 0 赞/ 211 阅读
相关 RMI——hello world程序 RMI——hello world程序 RMI作为分布式的基础之一,主要用来解决的问题是两个jvm进程间通讯的问题。RMI可以用作提供统一的服务接口和实现,方面各个系统间统 迈不过友情╰/ 2022年06月13日 04:52/ 0 赞/ 160 阅读
相关 libevent源码解析(八)hello, world 在前面一到七篇介绍了一些基本数据结构和相关API的内部源码后,本文主要看看libevent自带的测试代码里最简单的经典:hello, world源码。 完整源码及注释 太过爱你忘了你带给我的痛/ 2022年05月13日 05:24/ 0 赞/ 140 阅读
相关 1.WebSocket编程—Hello World [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 1.引入jar包 <dependencie ╰半橙微兮°/ 2022年01月14日 01:37/ 0 赞/ 213 阅读
还没有评论,来说两句吧...