libev本身是跨平台的,但是本文是为了讲解libevwork的(libevwork仅支持linux),所以下面所有的操作均在linux下进行。
下载:
安装:
解压:
tar -zxvf libev-4.15.tar.gz
cd libev-4.15
编译安装:
./configure
make
sudo make install
安装完成后,在/usr/local/include下会放置ev.h等头文件,在/usr/local/lib下会放置libev.a等库文件。
这里请注意,操作系统默认可能没有把/usr/local/lib配置到库的搜索路径中,需要手动添加,执行:
sudo vim /etc/ld.so.conf
在尾部加入一行:
/usr/local/lib
保存退出,然后执行:
sudo ldconfig
动手体验:
下面写的程序是一个简单的tcp客户端,它连接127.0.0.1的9090服务,并且把从服务器接收到的内容简单回传。代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
struct ev_loop* g_pEvLoop = NULL;
// IO事件回调
void cbEvents(struct ev_loop *loop, struct ev_io *w, int revents);
int main(int argc, char* argv[])
{
// 创建套接字
int sockc = socket(AF_INET, SOCK_STREAM, 0);
if (sockc < 0)
{
printf("create socket failed! \n");
return -1;
}
// 设置连接的服务器地址
struct sockaddr_in sinto;
sinto.sin_family = AF_INET;
sinto.sin_addr.s_addr = inet_addr("127.0.0.1");
sinto.sin_port = htons(9090);
// 连接服务器
int ret = connect(sockc, (struct sockaddr*)&sinto, sizeof(sinto));
if (ret < 0)
{
printf("connect failed! \n");
return -1;
}
printf("connect ok! \n");
// 初使化ev_loop对象
g_pEvLoop = ev_default_loop(0);
// 注册读事件
ev_io evio;
ev_io_init(&evio, &cbEvents, sockc, EV_READ);
ev_io_start(g_pEvLoop, &evio);
// 启动事件循环
printf("ev start! \n");
ev_run(g_pEvLoop, 0);
printf("ev stop! \n");
return 0;
}
// IO事件回调
void cbEvents(struct ev_loop *loop, struct ev_io *w, int revents)
{
int sockc = w->fd;
// 检测读事件
if ((revents & EV_READ) == EV_READ)
{
char sbuf[1024] = { 0 };
int bytes_in = recv(sockc, sbuf, 1023, 0);
// 连接中断
if (bytes_in <= 0)
{
printf("disconnect! \n");
// 取消事件注册
ev_io_stop(g_pEvLoop, w);
// 释放连接资源
close(sockc);
// 退出事件循环
ev_break(g_pEvLoop, EVBREAK_ALL);
return;
}
// 文本内容,可简单打印
printf("recv: %s \n", sbuf);
// 简单回传
send(sockc, sbuf, bytes_in, 0);
}
}
将代码保存为evtest.c,然后编译:
gcc -o evtest evtest.c -lev
服务端简单地用nc工具来代替,使用nc还有一个好处就是,它能够接收控制台的输入并发送给对端,执行过程如下:
[test@localhost ~]$ nc -lv4 9090
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on 0.0.0.0:9090
Ncat: Connection from 127.0.0.1.
Ncat: Connection from 127.0.0.1:56792.
a
a
b
b
c
c
^C
客户端执行过程如下:
[test@localhost tmp]$ ./evtest
connect ok!
ev start!
recv: a
recv: b
recv: c
disconnect!
ev stop!