IO管道, IO映射, IO端口转发, LIB-ZC

LIB-ZC 支持 IO管道, IO映射, IO端口转发, 支持 OPENSSL; 两种方法: 基于基于协程异步IO

基于协程环境

void zcoroutine_go_iopipe(int fd1, SSL *ssl1, int fd2, SSL *ssl2, zcoroutine_base_t *cobs, void (*after_close)(void *ctx), void *ctx);

在协程环境下, 此函数在两组 socket(fd1,ssl1 和 fd2,ssl2) 之间建立管道, 做数据转发

数据转发终止后, 执行函数 after_close(ctx); 自动释放 fd1/ssl1, fd2/ssl2

基本流程

第一, 准备一个协程环境 (zcoroutine_base_t *)cobs

第二, 和第1个端口建立了连接, 得到 (int)fd1; 如果是 SSL, 则建立 OEPNSSL 通道, 得到 (SSL *)ssl1

第三, 和第2个端口建立了连接, 得到 (int)fd2; 如果是 SSL, 则建立 OEPNSSL 通道, 得到 (SSL *)ssl2

第四, 执行函数 zcoroutine_go_iopipe(fd1, ssl1, fd2, cobs, ssl2, 0, 0);
则在当协程环境 cobs, 管道建立成功; cobs==0: 表示当前线程的协程环境

基于异步IO

void zaio_iopipe_enter(zaio_t *aio1, zaio_t *aio2, zaio_base_t *aiobase, void (*after_close)(void *ctx), void *ctx)

在异步IO环境下, 此函数在两个"异步IO"(client和server) 之间建立管道, 做数据转发

数据转发终止后, 执行函数 after_close(ctx); 自动释放 aio1, aio2 和底层资源(fd, ssl)

基本流程

第一, 准备一个"异步IO环境" (zaio_base_t *)aiobase

第二, 和第1个端口建立了连接(或OPENSSL连接), 得到 aio1

第三, 和第2个端口建立了连接(或OPENSSL连接), 得到 aio2

第四, 执行函数 zaio_iopipe_enter(aio1, aio2, aiobase, 0, 0);
则在异步IO环境aiobase, 管道建立成功; aiobase 可以在其他线程

案例讲解: IMAP 服务器反向代理

需求描述

已知: 内网有多台 IMAP 服务器, 每个服务器服务不同的帐号; 网关对外提供 IMAP 服务

问题: 在网关根据不同的帐号反向代理到不同的内网服务器, 怎么办 ?

重点提示: IMAP 协议及其复杂, 代理服务器没必要实现全部 IMAP 协议解析

本文只介绍 LIB-ZC 提供的 IO管道的方法

实现1: (协程环境)

第一步, 初始化 协程环境, 得到 (zcoroutine_base_t *)cobs

第二步, 监听 143 端口, 993(SSL) 端口; 客户端成功连接后, 得到 (int)client_fd 或 (SSL *)client_ssl

第三步, 处理客户端基本 IMAP 协议(欢迎语, capability, starttls 等)

第四步, 处理客户端命令 login(login 命令里有帐号信息), 根据帐号得到相应的后端服务器地址

第五步, 连接后端服务器 143/993 端口, 成功后, 得到 (int)server_fd 或 (SSL *)server_ssl

第六步, 处理服务端基本 IMAP协议(欢迎语, 等)

第七步, 处理自定义指令; 如传递客户端的ip/port等信息

第八步, 执行下面函数建立管道

zcoroutine_go_iopipe(client_fd, client_ssl, server_fd,  server_ssl, cobs, after_close, ctx);

从现在开始, 程序不再干预客户端和后端服务器之间的数据传输

等连接终止后, 执行函数

after_close(ctx);

实现2: (异步IO环境)

第一步, 初始化 异步IO环境, 得到 (zaio_base_t *)aiobase

第二步, 监听 143 端口, 993(SSL) 端口; 客户端成功连接后, 得到 (zaio_t *)client_aio

第三步, 处理客户端基本 IMAP 协议(欢迎语, capability, starttls 等)

第四步, 处理客户端命令 login(login 命令里有帐号信息), 根据帐号得到相应的后端服务器地址

第五步, 连接后端服务器 143/993 端口, 成功后, 得到 (zaio_t *)server_aio

第六步, 处理服务端基本 IMAP协议(欢迎语, 等)

第七步, 处理自定义指令; 如传递客户端的ip/port等信息

第八步, 执行下面函数建立管道

void zaio_iopipe_enter(client_aio, server_aio, aiobase, after_close, ctx);

从现在开始, 程序不再干预客户端和后端服务器之间的数据传输

等连接终止后, 执行函数

after_close(ctx);

例子

https://gitee.com/linuxmail/lib-zc/blob/master/sample/event/iopipe.c

https://gitee.com/linuxmail/lib-zc/blob/master/sample/coroutine/iopipe.c

京ICP备18054515号-2 eli960@qq.com qq: 1537212398