轻松搭建高性能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

一 下载需要的源码包

  所有安装包均选用最新的。

  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服务器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 轻松搭建高性能libevent echo服务器,享受优质网络传输体验 (libevent echo服务器)