轻松搭建高性能libevent echo服务器,享受优质网络传输体验 (libevent echo服务器)
网络传输一直是计算机应用领域中非常重要的一环。通过网络传输,我们可以将数据在不同主机之间传输,完成各种网络通信任务。因此,一个高效、可靠的网络传输环境是网络应用开发的基石之一。在这个过程中,一个优秀的网络传输工具也变得尤为重要。这篇文章将介绍如何使用libevent搭建一个高性能的echo服务器,并享受优质的网络传输体验。
libevent是一个基于C语言开发的高效、轻量级的事件驱动框架。它支持多种I/O模式(select、poll、epoll,kqueue等),可以使用不同的I/O模式完成不同的事件处理任务。使用libevent可以大大缩短网络应用开发的时间,提高网络应用的性能,而且这个框架还非常容易上手。
下面我们将介绍如何搭建一个简单的libevent echo服务器,并进行模拟测试。
## 之一步:环境配置
libevent项目官网提供了完整的环境配置说明,在此不再讲述。大体步骤为:
1. 下载libevent源码包。
2. 解压源码包,进入解压后的目录。
3. 执行configure命令
4. 执行make命令并安装
这里我们不再赘述,具体的配置步骤可以参考官网说明。
## 第二步:编写代码
我们需要在libevent中使用C语言编写echo服务器的代码。这里我们以简单的TCP echo服务器为例,代码如下面所示:
“`
#include
#include
#include
#include
#include
#include
#define SERVER_PORT 12345
/* Accept a new client connection */
void accept_conn_cb(evutil_socket_t listen_sock, short ev_flags, void *arg) {
struct event_base* base = (struct event_base*)arg;
int conn_sock = accept(listen_sock, NULL, NULL);
if (conn_sock
perror(“accept”);
exit(EXIT_FLURE);
}
/* Create a new bufferevent to handle client I/O */
struct bufferevent* bev = bufferevent_socket_new(base, conn_sock, BEV_OPT_CLOSE_ON_FREE);
if (!bev) {
perror(“bufferevent_socket_new”);
exit(EXIT_FLURE);
}
/* Set up event callbacks */
bufferevent_setcb(bev, NULL, NULL, NULL, NULL);
bufferevent_enable(bev, EV_READ|EV_WRITE);
printf(“New client connected\n”);
}
/* Read data from the client */
void read_cb(struct bufferevent *bev, void *ctx) {
struct evbuffer *input = bufferevent_get_input(bev);
struct evbuffer *output = bufferevent_get_output(bev);
evbuffer_add_buffer(output, input);
}
/* Handle error events */
void event_cb(struct bufferevent *bev, short events, void *ctx) {
if (events & BEV_EVENT_ERROR) {
perror(“Error from bufferevent”);
}
bufferevent_free(bev);
}
int mn(int argc, char** argv) {
struct event_base* base = event_base_new();
if (!base) {
perror(“event_base_new”);
exit(EXIT_FLURE);
}
/* Create socket and bind to address:port */
evutil_socket_t listen_sock = socket(AF_INET, SOCK_STREAM|SOCK_NONBLOCK, 0);
if (listen_sock
perror(“socket”);
exit(EXIT_FLURE);
}
evutil_make_listen_socket_reuseable(listen_sock);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(SERVER_PORT);
if (bind(listen_sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
perror(“bind”);
exit(EXIT_FLURE);
}
/* Start listening for incoming connections */
if (listen(listen_sock, SOMAXCONN)
perror(“listen”);
exit(EXIT_FLURE);
}
printf(“Listening on port %d\n”, SERVER_PORT);
/* Set up event callbacks */
struct event *conn_event = event_new(base, listen_sock, EV_READ|EV_PERSIST, accept_conn_cb, base);
if (!conn_event) {
perror(“event_new”);
exit(EXIT_FLURE);
}
event_add(conn_event, NULL);
/* Enter the event loop */
event_base_dispatch(base);
/* Clean up */
event_base_free(base);
return EXIT_SUCCESS;
}
“`
这个例子中我们使用了libevent提供的bufferevent结构体来处理连接,这个结构体简化了读写事件的处理,减少了代码的复杂度,同时也能够大幅度提高网络应用的性能。
## 第三步:编译代码
我们需要将编写好的源代码编译成可执行文件。在这个例子中,我们使用了GNU的make工具来完成编译,其Makefile内容如下所示:
“`
CC=gcc
CFLAGS=-I. -levent
all : server
server : mn.o
$(CC) -o server mn.o $(CFLAGS)
mn.o : mn.c
$(CC) -c -o mn.o mn.c $(CFLAGS)
clean :
rm -f *.o server
“`
我们可以使用make命令来编译:
“`
$ make
“`
如果编译成功,我们将得到一个名为server的可执行文件,并且不会有任何编译错误提示。
## 第四步:启动服务器并进行测试
接下来,我们使用命令行来启动echo服务器:
“`
$ ./server
“`
如果一切正常,服务端将会提示“Listening on port 12345”,说明服务器已经启动成功并且正在监听12345端口。
之后,我们可以使用telnet命令来模拟客户端连接到我们的服务器。在终端中运行以下命令:
“`
$ telnet 127.0.0.1 12345
“`
之后我们输入一些字符并回车,这些字符将被发送到服务器,并在终端中回显。输入exit之后回车,客户端将会退出连接。由于我们使用了libevent,服务器性能非常高效,可以在短时间内处理大量的客户端请求。
##
相关问题拓展阅读:
- php7无法安装memcache扩展 系统 centos-6.8 Nginx-1.10.2 PHP-7.0.13/5.6.28 memcached-1.4
php7无法安装memcache扩展 系统 centos-6.8 Nginx-1.10.2 PHP-7.0.13/5.6.28 memcached-1.4
一 下载需要的源码包
所有安装包均选用最新的。
1. 下载libevent2.0.22
点击红色部分下载
下载memcached1.4.24
点击红色部分,下载最新版本
下载php扩展memcache3.0.8
选择需要的版本
二 安装详细步骤
首先将以上三个软件包下载到/tmp目录下
1. 安装libevent
cd /tmp #首先进入到该下载包的目录
tar zxvf libevent-2.0.22-stable.tar.gz #解压包cd libevent-2.0.22-stable #进入到解压的目录./configure –prefix=/usr/local #编译前配置,生成Makefile文件,路径可自行更改make; make install #编译+安装
1
测试是否安装成功
看到这些信息,表示成功啦
2. 安装memcached
cd /tmp #首先进入到该下载包的目录
tar zxvf memcached-1.4.24.tar.gz #解压包
cd memcached-1.4.24 #进入到解压的目录
./configure –with-libevent=/usr/local #编译前配置,生成Makefile文件,路径必须与libevent中一致make; make install #编译+安装如举
1
测试是否安装成功
表示成功的信息
通过以上操作,就完成了memcached服务器的安装。特别的简单吧!现在就来搞一搞memcache的php扩展安装吧3. 安装扩展
cd /tmp #首先进入到该下载包的目录
tar zxvf memcache-3.0.8.tgz #解压包
cd memcache-3.0.8 #进入到解压的目录
/opt/lampp/bin/phpize #动态为php添加扩展。phpize路径可能不一致,请根据自己的实际情况./configure –enable-memcache –with-php-config=/opt/lampp/bin/php-config –with-zlib-dir #php-config请根据自己环境情况填写make; make install #编译+安装
1
完成以上步骤时,心情愉悦的点击了enter,准备喝口水潇洒一下,结果出现了一下错误(这也是我写这篇博客的原因,要不都懒得记录了)错误信息
看了下代码错误信息,说是zlib.h找不到。找不到就给他安一个嘛。真是的安装zlib
下载zlib-1.2.8.tar.gz
下载地址:
如图:
红色部分点击
cd /tmp #首先进入到该下载包的目录
tar zxvf zlib-1.2.8.tar.gz #解压包
cd zlib-1.2.8 #进入到解压的目录袜橡段
./configure –prefix=/usr/local/zlib
make; make install #编译+安装
1
再进行配置一下系统的文件,加载刚才编告誉译安装的zlib生成的库文件vi /etc/ld.so.conf.d/zlib.conf
加入如下内容后保存退出: /usr/local/zlib/lib也就是添加安装目录的文件路径,库文件。ldconfig 运行之后就会加载安装的库文件了。
OK,到这一步了,此时,重新在memcache的php扩展中执行make;make install命令如果看到以下信息,表示成功:
扩展安装成功
三 配置php.ini文件
首先通过phpinfo函数,找到php.ini的路径,我的是:/opt/lampp/etc/php.ini在其中添加如下内容:
修改extension_dir路径:
extension_dir = “/opt/lampp/lib/php/extensions/no-debug-non-zts/”
extension=memcache.so
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
然后重新启动apache,再次通过phpinfo查看一下情况。如果有如下内容,表示配置成功:
信息
四 配置memcached服务器
启动memcached服务器
memcached -d -m 10 -u root -l 127.0.0.1 -pc 256 -P /tmp/memcached.pid参数说明:
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址127.0.0.1,-p是设置Memcache监听的端口,我这里设置了11211,更好是1024以上的端口,-c选项是更大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid2. 结束memcached进行
kill cat /tmp/memcached.pid
3. 检查memcached是否已经启动
看到绿色框中内容,就表示完成
五 测试php的memcache扩展
connect(“192.168.12.201”, 13001);
$mem->set(‘key’,’This is a test!’, 0, 60);$val = $mem->get(‘key’);
echo $val;
?>
关于libevent echo服务器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。