1.软件与服务器
首先,你需要一台服务器,我们使用的实例为阿里云的轻量级服务器,运行在Alibaba Cloud Linux 3.2104 LTS 64位(cent os8)上,如果使用其他的linux系统,比如ubantu,可能在某些命令行上有细微的差别。
为了方便后续的代码书写查询,建议先补全man手册,yum install -y man-pages
好了,开始安装libevent
//下载openssl
wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
//解压并且安装openssl
tar -zxvf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l/
./config
make -j16
sudo make install
//检查是否安装libevent
ls -al /usr/lib | grep libevent
//没有安装过,下载最新版本【版本改为自己的】,解压【注意选一个自己顺手的目录】
wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
tar -zxvf libevent-2.1.12-stable.tar.gz
cd libevent-2.1.12-stable/
//切换到解压后的 libevent 主目录,准备好root权限
./configure –prefix=/usr (或 ./configure --program-prefix=/usr)
make
make install
//测试安装是否成功
ls -al /usr/lib | grep libevent(或 ls -al /usr/local/lib | grep libevent)
安装成功会显示一张图
//如果你的目录安装在了/usr/local/lib 需要建立一个软连接【版本改为自己的】
ln -s /usr/local/lib/libevent-2.0.so.22 /usr/lib/libevent-2.0.so.22
2.简单的函数介绍与使用
基础函数的具体解释见头文件:
使用基础函数实现进程间通信:
GitHub地址(头文件与实例):https://github.com/zhaolingxi/web_program1
接收端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<stdlib.h>
#include<event.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
void fifo_read(evutil_socket_t fd, short events, void * arg)
{
char buf[32]={0};
int ret=read(fd,buf ,sizeof(buf));
if(-1==ret)
{
perror("read");
exit(1);
}
printf("read form pipe %s\n",buf);
}
int main()
{
int ret=mkfifo("fifo.temp",00700);
if(-1==ret)
{
perror("mkfifo");
exit(1);
}
int fd=open("fifo.temp",O_RDONLY);
if(-1==fd)
{
perror("open");
exit(1);
}
struct event ev;
//init
event_init();
event_set(&ev,fd,EV_READ | EV_PERSIST,fifo_read,NULL);
event_add(&ev,NULL);
event_dispatch();
return 0;
}
发送端:
#include <sys/stat.h>
#include<stdlib.h>
#include<event.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>
int main()
{
int fd = open("fifo.temp", O_WRONLY);
if (-1 == fd)
{
perror("open");
exit(1);
}
char buf[32] = { 0 };
while (1)
{
scanf("%s", buf);
int ret = write(fd, buf, strlen(buf));
if (-1 == ret)
{
perror("write");
exit(1);
}
if (!strcmp(buf, "bye"))
{
break;
}
memset(buf, 0, sizeof(buf));
}
return 0;
}
3.封装函数简介与使用
使用封装函数的实例:
GitHub地址(头文件与实例):https://github.com/zhaolingxi/web_program1
#include<stdio.h>
#include<stdlib.h>
#include<event.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<string.h>
#include<event2/listener.h>
void read_cb(struct bufferevent *bev, void *ctx)
{
int fd=*(int *)ctx;
char * buf[128]={0};
size_t ret=bufferevent_read(bev,buf,sizeof(buf));
if(ret<0)
{
printf("read_fail\n");
exit(1);
}
else
{
printf("read form: %d %s\n",fd,buf);
}
}
void event_cb(struct bufferevent *bev, short what, void *ctx)
{
if(what &BEV_EVENT_EOF)
{
int fd1=*(int*)ctx;
printf("BEV_EVENT_EOF %d \n",fd1);
bufferevent_free(bev);
}
else {
printf("error\n");
}
}
void listenercb(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *addr, int socklen, void *arg)
{
printf("connect with:",fd);
struct event_base* base=arg;
struct bufferevent * BV=bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);
if(!BV)
{
printf("BV fail\n");
exit(1);
}
bufferevent_setcb(BV, read_cb,NULL,event_cb,&fd);
bufferevent_enable(BV,EV_READ);
}
int main()
{
struct event_base* base=event_base_new();
if(!base)
{
printf("constrct fail\n");
exit(1);
}
struct sockaddr_in server_addr;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=8000;
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
struct evconnlistener *listener= evconnlistener_new_bind(base,listenercb,NULL,LEV_OPT_CLOSE_ON_FREE |LEV_OPT_REUSEABLE,10,
(struct sockaddr*)&server_addr,sizeof(server_addr));
if(!listener)
{
printf("construct listener fail\n");
exit(1);
}
event_base_dispatch(base);
evconnlistener_free(listener);
event_base_free(base);
return 0;
}
Q.E.D.