资讯专栏INFORMATION COLUMN

使用 libev 构建 TCP 响应服务器(echo server)的简单流程

ymyang / 3227人阅读

摘要:事件同理准备用来的读取的方法就视乎程序员的实现啦把数据回去原文例子使用的就是,实际上我个人偏爱的是启动这里可以直接使用系列篇官方文档学习笔记概述和官方文档学习笔记基础官方文档学习笔记常用接口使用构建响应服务器的简单流程本文

请注意这是 libev 而不是 libevent 的文章!
这篇文章主要是使用具体的例子,说明如何使用 libev。网上不少文章都是照抄示例,一点用都没有……本文将示例的代码精简一下,补上说明;大家都懂的部分就不赘述了。需要完整源码请查看参考资料。

本文地址:https://segmentfault.com/a/1190000006691243

Reference

Create tcp echo server using libev

基本流程

创建 socket,绑定 socket 地址

Listen socket

创建一个 watcher,用来承载accept事件

写一个 callback 用来做实际的accept调用

创建并初始化一个 watcher 用来从 client 中读取请求

写一个 callback 用来read

启动 event loop

创建 socket 并绑定 address

注意:原文例子中未显示的是,应当将 fd 设置为非阻塞的。带非阻塞设置的代码如下:

some_init_func()
{
    ...
    
    sd = socket (PF_INET, SOCK_STREAM, 0);
    flags = fcntl (sd, F_GETEL, 0);
    fcntl (sd, F_SETEL, flags | O_NONBLOCK);
    
    bzero (&addr, sizeof(addr));
    ...                    // 设置 Address 和 port
    bind (sd, (struct sockaddr *)(&addr), sizeof(addr));
    
    ...
}
监听端口
some_init_func()
{
    ...
    
    listen (sd, 2);
    
    ...
}
准备用来accept()的 watcher
some_init_func()
{
    ...
    
    ev_io_init (&w_accept, accept_cb, sd, EV_READ);
    ev_io_start (loop, &w_accept);
    
    ...
}

回调函数如下:

static void accept_cb (struct ev_loop *loop,
                       struct ev_io *watcher,
                       int revents)
{
    ...
    client_sd = accept (watcher->fd,                // accept() 调用,接受传入连接
                        (struct sockaddr *)(&client_addr),
                        &client_len);
    ...
    w_client = (struct ev_io *)malloc(sizeof(struct ev_io));        // 为 read watcher 准备内存
    ...
    ev_io_init (w_client, read_cb, client_sd, EV_READ);             // 这里就只示例 read 事件了。write 事件同理
    ev_io_start (loop, w_client);
}
准备用来read()的 callback
static void read_cb (struct ev_loop *loop,
                     struct ev_io *watcher,
                     int revents)
{
    ...
    readCount = recv (watcher->fd, buffer, BUFFER_SIZE, 0);        // 读取的方法就视乎程序员的实现啦
    send (watcher->fd, buffer, readCount, 0);                      // 把数据 echo 回去
    ...
}

原文例子使用的就是recv/send,实际上我个人偏爱的是read/write

启动 event loop
ev_loop (loop, 0);        // 这里可以直接使用 default loop
系列篇

Libev 官方文档学习笔记(1)——概述和 ev_loop
Libev 官方文档学习笔记(2)——watcher 基础
Libev 官方文档学习笔记(3)——常用 watcher 接口
使用 libev 构建 TCP 响应服务器的简单流程(本文)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9422.html

相关文章

  • Laravel xunsearch 全文搜索

    摘要:开始之前强烈推荐先浏览一下的官方文档简介是一个高性能全功能的全文检索解决方案。旨在帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎。一定要重建索引。否则不会报错,但是搜索结果会不正确。 开始之前强烈推荐先浏览一下 xunsearch 的官方文档 Xunsearch简介 Xunsearch 是一个高性能、全功能的全文检索解决方案。Xunsearch 旨在帮助一般开发者...

    gecko23 评论0 收藏0
  • libevent 中使用 MariaDB(MySQL)

    摘要:实线表示该状态的流转需要经过异步等待调用后才能获取相应的状态码或返回值进行检查后才可以进行的状态流转,虚线表示在该状态下即已有足够的变量可进行状态流转。而函数的返回值,则换成一个类型的变量,用于适配异步。 在之前我翻译的官方文档中提到了 MariaDB 提供了对异步 I/O 的支持。那篇文章是一个比较简要的介绍。不过实际适配中,官方也提供了一个完整适配 libevent 的示例代码。本...

    djfml 评论0 收藏0
  • Nginx

    摘要:主进程不直接响应浏览器,是管理子进程使用。浏览器访问会到子进程中响应。日志需要备份,文件在被进程所打开,不能使用命令。是设置变量使用,可以达到多条件判断时做标记使用。 nginx 简介 高性能WEB服务器 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器.Nginx 是由Igor Sysoev为落实访问量第二...

    luck 评论0 收藏0
  • Nginx

    摘要:主进程不直接响应浏览器,是管理子进程使用。浏览器访问会到子进程中响应。日志需要备份,文件在被进程所打开,不能使用命令。是设置变量使用,可以达到多条件判断时做标记使用。 nginx 简介 高性能WEB服务器 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器.Nginx 是由Igor Sysoev为落实访问量第二...

    hikui 评论0 收藏0
  • memcached 安装配置

    摘要:依赖获取编译旧版本可能会被其他软件依赖此处建议安装在独立目录编译获取若是编译安装需要指定的目录提供服务脚本的常用选项说明指定进程监听的地址以服务模式运行以指定的用户身份运行进程用于缓存数据 依赖: linevent 获取: http://libevent.org/编译(旧版本可能会被其他软件依赖, 此处建议安装在独立目录): # ./configure --prefix=/usr/lo...

    gotham 评论0 收藏0

发表评论

0条评论

ymyang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<