接下來要談的是
libevent 要如何使用,不過為了方便起見,我們直接寫一個很簡單的 Time Server 來當作例子:當你連上去以後 Server 端直接提供時間,然後結束連線。
在這些例子裡面我以
FreeBSD 6.0 當作測試的平台,另外使用
libevent 1.1a 當作 Event-based Library,Compile 時請使用
gcc -I/usr/local/include -o timeserver timeserver.c -L/usr/local/lib -levent
(如果
libevent 的 Header 與 Library 放在
/usr/include
與
/usr/lib
下的話可以省略這兩個參數)。
原始程式碼在文章的最後頭。
event_init()
表示初始化
libevent 所使用到的變數。
event_set(&ev, s, EV_READ | EV_PERSIST, connection_accept, &ev)
把
s
這個 File Description 放入
ev
(第一個參數與第二個參數),並且告知當事件 (第三個參數的
EV_READ
) 發生時要呼叫
connection_accept()
(第四個參數),呼叫時要把
ev
當作參數丟進去 (第五個參數)。
其中的
EV_PERSIST
表示當呼叫進去的時候不要把這個 event 拿掉 (繼續保留在 Event Queue 裡面),這點可以跟
connection_accept()
內在註冊
connection_time()
的程式碼做比較。
而
event_add(&ev, NULL)
就是把
ev
註冊到 event queue 裡面,第二個參數指定的是 Timeout 時間,設定成
NULL
表示忽略這項設定。
最後的
event_dispatch()
表示進入 event loop,當 Queue 裡面的任何一個 File Description 發生事件的時候就會進入 callback function 執行。
這隻程式非常粗糙,有很多地方沒有注意到 Blocking 的問題,這點我們就先不管了。當跑起來以後你就可以連到 port 7000,就會出現類似下面的結果:gslin@netnews [~] [3:14/W5] t 0 7000
gslin@netnews [~/work/C] [3:15/W3] t 0 7000
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
Fri Nov 25 03:15:10 2005
Connection closed by foreign host.
最基本的使用就是這樣了,你可以
man event
看到完整的說明。
這是
timeserver.c
:
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <event.h>
#include <stdio.h>
#include <time.h>
void connection_time(int fd, short event, struct event *arg)
{
char buf[32];
struct tm t;
time_t now;
time(&now);
localtime_r(&now, &t);
asctime_r(&t, buf);
write(fd, buf, strlen(buf));
shutdown(fd, SHUT_RDWR);
free(arg);
}
void connection_accept(int fd, short event, void *arg)
{
/* for debugging */
fprintf(stderr, "%s(): fd = %d, event = %d.\n", __func__, fd, event);
/* Accept a new connection. */
struct sockaddr_in s_in;
socklen_t len = sizeof(s_in);
int ns = accept(fd, (struct sockaddr *) &s_in, &len);
if (ns < 0) {
perror("accept");
return;
}
/* Install time server. */
struct event *ev = malloc(sizeof(struct event));
event_set(ev, ns, EV_WRITE, (void *) connection_time, ev);
event_add(ev, NULL);
}
int main(void)
{
/* Request socket. */
int s = socket(PF_INET, SOCK_STREAM, 0);
if (s < 0) {
perror("socket");
exit(1);
}
/* bind() */
struct sockaddr_in s_in;
bzero(&s_in, sizeof(s_in));
s_in.sin_family = AF_INET;
s_in.sin_port = htons(7000);
s_in.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *) &s_in, sizeof(s_in)) < 0) {
perror("bind");
exit(1);
}
/* listen() */
if (listen(s, 5) < 0) {
perror("listen");
exit(1);
}
/* Initial libevent. */
event_init();
/* Create event. */
struct event ev;
event_set(&ev, s, EV_READ | EV_PERSIST, connection_accept, &ev);
/* Add event. */
event_add(&ev, NULL);
event_dispatch();
return 0;
}
Network Programming Using Libevent - (III)
這次要談的跟 Network Programming 沒有直接的關係。
在寫 Nonblocking Network Program 通常要處理 Buffering 的問題,但並不好寫,主要是因為
read()
或
recv()
不保證可以一次讀到一行的份量進來。
在
libevent 裡面提供相當不錯的 Buffer Library 可以用,完整的說明在
man event
的時候可以看到,最常用的應該就是以
evbuffer_add()
、
evbuffer_readline()
這兩個 Function,其他的知道存在就可以了,需要的時候再去看詳細的用法。
下面直接提供
libevent-buff.c
當作範例,編譯後看執行結果,再回頭來看 source code 應該就有感覺了:
#include <sys/time.h>
#include <event.h>
#include <stdio.h>
void printbuf(struct evbuffer *evbuf)
{
for (;;) {
char *buf = evbuffer_readline(evbuf);
printf("* buf = %p, the string = \"\e[1;33m%s\e[m\"\n", buf, buf);
if (buf == NULL)
break;
free(buf);
}
}
int main(void)
{
struct evbuffer *evbuf;
evbuf = evbuffer_new();
if (evbuf == NULL) {
fprintf(stderr, "%s(): evbuffer_new() failed.\n", __func__);
exit(1);
}
/* Add "gslin" into buffer. */
u_char *buf1 = "gslin";
printf("* Add \"\e[1;33m%s\e[m\".\n", buf1);
evbuffer_add(evbuf, buf1, strlen(buf1));
printbuf(evbuf);
u_char *buf2 = " is reading.\nAnd he is at home.\nLast.";
printf("* Add \"\e[1;33m%s\e[m\".\n", buf2);
evbuffer_add(evbuf, buf2, strlen(buf2));
printbuf(evbuf);
evbuffer_free(evbuf);
}
内容来源:http://www.cublog.cn/u/5251/showart_270584.html
顺便建议参考:http://unx.ca/log/category/libevent/
相关推荐
《Fast Portable non-blocking network programming with Libevent》是一本关于Libevent库的书籍,它专注于指导读者如何使用Libevent 2.0或更高版本来编写快速、可移植且支持异步I/O的网络程序。本书的作者是Nick ...
《编程与Libevent英文版》是关于网络编程的一份重要资料,主要介绍了一个名为Libevent的开源库。Libevent是一个事件通知库,它为多种操作系统提供了统一的接口,用于处理异步非阻塞I/O操作,特别适用于网络编程。这...
《编程与Libevent》这本书是关于使用Libevent库进行网络编程的重要参考资料。Libevent是一个开源的事件通知库,它提供了一种高效的方式来处理大量的并发I/O操作,特别适合于网络服务器的开发。以下是对该书内容及...
英文版,由http://libevent.org/的官方网站上http://www.wangafu.net/~nickm/libevent-book/获取git repos制作而成。授权协议:the Creative Commons Attribution-Noncommercial-Share Alike license, version 3.0
《Programming with Libevent》这本书是关于使用Libevent库进行网络编程的权威指南。Libevent是一个开源的事件通知库,主要用于解决跨平台的异步非阻塞I/O问题,尤其适用于处理大量的并发连接。该库主要面向Linux...
libevent book 必备参考资料,方便学习libevent网络库
Libevent是一个开源的事件通知库,它提供了事件驱动的网络编程接口,用于处理网络上的并发连接。这个库特别适用于构建高性能、高并发的服务端应用。其主要特点是: 1. 事件驱动:Libevent的核心机制是事件驱动,...
Name : libevent-devel ... If you like to develop programs using libevent, you will need to install libevent-devel. RPM found in directory: /mirror/www.startcom.org/AS-5.0.0/updates/x86_64
《C++ Network Programming》是关于使用C++进行网络编程的一门技术主题,涵盖了从基础知识到高级应用的广泛内容。在C++中进行网络编程需要理解网络通信的基本原理、C++语言特性和网络库的使用。以下是一些核心知识点...
libevent是一个高性能的事件通知库,主要由Nick Mathewson和Abdul Razzaq开发,用C语言编写。它基于Reactor设计模式,并提供了一个轻量级、跨平台、多线程的事件循环,广泛应用于网络服务器的开发中,能够处理多种I/...
在ubuntu里面使用 libevent 实现,作为
为方便阅读,把blog上的libevent源码深度剖析系列文章整合成一个pdf。
标题"libevent-vs2017编译"指的是使用Visual Studio 2017在Windows环境下编译开源库Libevent。Libevent是一个事件通知库,广泛用于编写高性能网络服务器,它提供了异步事件处理的能力,允许程序高效地处理大量并发...
本文将深入探讨如何在多线程环境中使用Libevent进行事件处理,并分享一个基于Libevent的多线程实现案例。 首先,理解Libevent的核心机制至关重要。Libevent提供了一个事件基础结构,它能够将来自不同来源的事件(如...
5. 接着,转到输入(Input)选项卡,在“附加依赖项”(Additional Dependencies)中,添加libevent的.lib文件名(例如:libevent.lib)。 在代码中,你需要包含libevent的头文件并初始化libevent库。例如: ```...
libevent2是libevent的第二个主要版本,带来了许多改进和新特性,旨在提高性能和易用性。 1. **事件模型** Libevent的核心是其事件模型,它基于一种非阻塞I/O模型。这种模型允许程序在等待I/O操作完成时继续执行...
《学习libevent入门电子书》是一本针对libevent这一开源事件库的学习资料,它对于深入理解和使用libevent具有极大的价值。libevent是一个高度可移植的库,它为编写高性能、异步网络应用提供了基础。在现代软件开发,...
Libevent 是一个高度可移植的事件通知库,它允许程序员编写高效的网络服务器和并发应用程序。这个库通过将事件处理机制抽象化,使开发者能够轻松地处理各种网络事件,如读写、连接完成、信号和定时器等。在本文中,...
在这个“运用libevent的缓存示例”中,我们将深入探讨如何利用libevent的API来创建和管理一个简单的缓存系统。 首先,让我们了解libevent的核心概念。它基于事件驱动模型,主要通过三种方式处理事件:水平触发...
libevent库,文字版,很清晰,附带libevent参考手册(中文版) libevent源码深度剖析,根据libevent开源代码框架进行剖析,很不错值得学习借鉴,还有libevent中C语言的功底值得学习揣摩!