当前位置: 首页 > 工具软件 > libev > 使用案例 >

linux arm 编译 libev,使用libev动手写网络程序1

程仲卿
2023-12-01

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!

 类似资料: