本节从一个示例入手,介绍如何使用 acl 的协程模块编写高并发高性能的网络服务。首先请参考下面的例子:
#include "lib_acl.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include "fiber/lib_fiber.h" static int __rw_timeout = 0; static void echo_client(ACL_FIBER *fiber acl_unused, void *ctx) { ACL_VSTREAM *cstream = (ACL_VSTREAM *) ctx; char buf[8192]; int ret; printf("current fiber id: %d\r\n", acl_fiber_self()); // 设置网络读写超时时间(秒) cstream->rw_timeout = __rw_timeout; #define SOCK ACL_VSTREAM_SOCK while (1) { // “阻塞”式从客户端读取一行数据 ret = acl_vstream_gets(cstream, buf, sizeof(buf) - 1); if (ret == ACL_VSTREAM_EOF) { printf("gets error: %s, fd: %d, count: %d\r\n", acl_last_serror(), SOCK(cstream), count); break; } buf[ret] = 0; //printf("gets line: %s", buf); // 回写该数据至客户端 if (acl_vstream_writen(cstream, buf, ret) == ACL_VSTREAM_EOF) { printf("write error, fd: %d\r\n", SOCK(cstream)); break; } } // 关闭客户端连接 acl_vstream_close(cstream); } static void fiber_accept(ACL_FIBER *fiber acl_unused, void *ctx) { ACL_VSTREAM *sstream = (ACL_VSTREAM *) ctx; printf("current fiber id: %d\r\n", acl_fiber_self()); for (;;) { // 接收客户端连接 ACL_VSTREAM *cstream = acl_vstream_accept(sstream, NULL, 0); if (cstream == NULL) { printf("acl_vstream_accept error %s\r\n", acl_last_serror()); break; } printf("accept one, fd: %d\r\n", ACL_VSTREAM_SOCK(cstream)); // 创建一个协程程用来处理该客户端连接对象 acl_fiber_create(echo_client, cstream, 32768); } // 关闭监听对象 acl_vstream_close(sstream); } static void usage(const char *procname) { printf("usage: %s -h [help]\r\n" " -s listen_addr\r\n" " -r rw_timeout\r\n" " -q listen_queue\r\n", procname); } int main(int argc, char *argv[]) { char addr[64]; ACL_VSTREAM *sstream; int ch, enable_sleep = 0, qlen = 128; acl_msg_stdout_enable(1); snprintf(addr, sizeof(addr), "%s", "127.0.0.1:9002"); while ((ch = getopt(argc, argv, "hs:r:q:")) > 0) { switch (ch) { case 'h': usage(argv[0]); return 0; case 's': snprintf(addr, sizeof(addr), "%s", optarg); break; case 'r': __rw_timeout = atoi(optarg); break; case 'q': qlen = atoi(optarg); break; default: break; } } // 创建监听套接口对象 sstream = acl_vstream_listen(addr, qlen); if (sstream == NULL) { printf("acl_vstream_listen error %s\r\n", acl_last_serror()); return 1; } printf("listen %s ok\r\n", addr); // 创建监听协程(该协程所占“栈”大小32768字节),负责监听外来客户端连接 acl_fiber_create(fiber_accept, sstream, 32768); // 开始协程调度过程 acl_fiber_schedule(); return 0; }
从上述例子可以看,使用协程进行网络服务编程的过程为:创建监听对象-->创建协程用于监控监听对象--->获得客户端连接--->创建协程处理客户端连接。
整个处理过程都是顺序编程方式,简单易懂,过程与使用线程进行网络编程相似。根据上面例子,首先介绍例子用到几个协程 API:
/** * 创建一个协程 * @param fn {void (*)(ACL_FIBER*, void*)} 协程运行时的回调函数地址 * @param arg {void*} 回调 fn 函数时的第二个参数 * @param size {size_t} 所创建协程所占栈空间大小 * @return {ACL_FIBER*} */ ACL_FIBER *acl_fiber_create(void (*fn)(ACL_FIBER *, void *), void *arg, size_t size); /** * 获得当前所运行的协程的 ID 号 * @return {int} 当前运行协程的 ID 号 */ int acl_fiber_self(void); /** * 调用本函数启动协程的调度过程 */ void acl_fiber_schedule(void);
其中,acl_fiber_create 用来创建新的协程,使用者需要将处理函数指针传入,以备协程运行时调用,同时可以传入该回调函数需要的参数,另外一个重要参数就是协程所占栈空间大小,该大小的选择需要应用根据实际情况设定(一般情况下设为64K就可以,如果应用本身嵌套或内部栈空间占用较大,则应增大此值);acl_fiber_self 用于当前协程获得自己的协程 ID 号标识;acl_fiber_schedule 被调用后便启动了协程的调度过程,目前每个线程有且仅有一个协程调度器,这就意味着每个线程创建后,均需调用一次 acl_fiber_schedule 过程,同时这也表明 acl 中的协程调用器是要求每个线程一个,相互间互不影响,如果线程之间需要交互,则可以通过后面介绍的 acl_mbox_send/acl_mbox_read 在线程之间传递对象或数据。
参考协程编程文章:《网络协程编程》,《编译使用 acl 协程库》,《使用协程方式编写高并发的 WEB 服务》
acl 下载:https://sourceforge.net/p/acl/
github 地址:https://github.com/acl-dev/acl
国内镜像:http://git.oschina.net/acl-dev/acl
QQ 群:242722074
相关推荐
本实验"使用基本ACL限制公司网络访问"旨在让学生深入理解并掌握如何通过访问控制列表(ACL)来实现这一目标。实验主要涉及了eNSP(Enterprise Network Simulation Platform,企业网络模拟平台)、ACL、VLAN以及三层...
3、应用场景:使用基本ACL限制公司网络访问 4、特点:Word文档提供了实验的详细过程,包括每一步骤的操作命令和截图,并给出了实验的topo文件(包括配置信息) 5、适用人群:网络系统的建设与运维 6、使用说明:重点...
3、应用场景:使用扩展ACL限制公司网络访问 4、特点:Word文档提供了实验的详细过程,包括每一步骤的操作命令和截图,并给出了实验的topo文件(包括配置信息) 5、适用人群:网络系统的建设与运维 6、使用说明:重点...
为了满足这些需求,我们可以使用 NAT、VLAN 和 ACL 技术来管理企业网络。 首先,让我们来讨论 NAT 技术。NAT(Network Address Translation)是一种将私有地址转换为公共地址的技术。 在企业中,通常只有一个或几个...
实验结果显示,使用 IP ACL 可以控制网络流量,使得网段 172.16.2.0 与 172.16.4.0 的主机可以进行通信,但网段 172.16.1.0 不允许访问 172.16.4.0 网段的主机。 知识点九:实验总结 实验总结显示,IP ACL 是实现...
protocol(用 C 语言写的一些网络应用协议库)、lib_acl_cpp(用 C++ 语言编写,封装了 lib_acl/lib_protocol 两个库,同时增加更多实用的功能库)、 lib_fiber(用 C 语言编写的支持高性能、高并发的网络协程库)、...
网络工程师在进行网络规划与管理时,经常需要实施单向访问控制(Access Control List, ACL),这是一种有效的网络安全策略,用于规范网络流量,确保数据的安全传输。本文将深入探讨单向访问控制ACL的概念、工作原理...
使用`ping`、`traceroute`、`telnet`和`debug`命令验证网络连通性和ACL的效果。 例如,如果要阻止PC1(1.1.1.200)访问DNS服务器(2.2.2.200),可以在R1的接口上配置一个扩展ACL,拒绝所有来自PC1的DNS请求(UDP...
《网络工程—ACL》课程是大学信息技术领域的重要组成部分,主要探讨如何通过访问控制列表(Access Control Lists,简称ACL)来管理网络流量,保障网络安全。ACL是网络设备如路由器和交换机上的一个重要功能,用于...
1. **服务器开发框架**:ACL框架提供了一套完整的服务器开发工具,使得开发者可以快速构建高性能、高并发的网络服务。它包含了请求处理、连接管理、会话维护等核心模块,简化了网络服务器的开发流程。 2. **同步...
使用 ACL 可以实现报文过滤、阻塞攻击报文、为不同类报文流提供差分服务等功能。ACL 的使用方法可以分为以下几个步骤: 1. 创建 ACL:创建 ACL 需要指定 ACL 的名称和编号。 2. 定义 ACL 规则:定义 ACL 规则需要...
1.3 ACL使用原则 - **最小权限原则**:只授予完成任务所需的最低权限。 - **最靠近受控对象原则**:访问控制尽可能接近受控资源。 - **默认丢弃原则**:每个ACL末尾隐含一条拒绝所有其他流量的规则。 **2. ACL在...
在华为路由器中,ACL可以被用于过滤数据包,限制特定IP地址、端口或服务的访问,从而实现对网络资源的精细化控制。 1. ACL的基本概念: - ACL是一个规则集合,这些规则定义了允许或拒绝的数据包的特定条件。 - 在...
1.3 ACL使用原则 在配置ACL时需要遵循一定的原则,以确保安全性和网络的正常运行。首先,最小权限原则要求只授予需要执行任务的对象所必须的最小权限。其次,最近受控对象原则指的是实施网络层权限控制时,要尽量...
总的来说,ACL的使用是为了实现网络安全策略,限制特定源或目的地址的网络访问,保护网络资源免受恶意或未授权的访问。在这个场景中,通过定义ACL,我们可以确保只有特定的流量能够通过网络,提高网络的安全性和可控...
通过使用ACL,网络管理员能够根据特定的标准来过滤网络流量,从而实现精细化的网络管理。 - **作用**: - **过滤流量**: 根据源地址、目的地址、端口号等条件过滤进入或离开路由器的数据包。 - **安全控制**: 控制...
在锐捷交换机上配置基于时间的ACL,可以进一步细化策略,使得规则只在特定的时间段内生效,这对于企业网络管理尤为实用,例如限制非工作时间的网络访问或特定服务。 基于时间的ACL配置主要涉及到以下几个关键概念:...
华为Ensp,基本ACL,高级ACL,三层ACL,二层ACL,命名ACL配置大全.doc
ACL 可以应用于各种网络场景,例如企业网络、校园网络、数据中心等,用于控制网络流量的访问权限。 9. ACL 的优缺点 ACL 的优点是可以控制网络流量的访问权限,提高网络安全性;缺点是配置较为复杂,需要一定的网络...
"H3C交换机典型配置举例-6W100-ACL典型配置举例" 本文将详细介绍H3C交换机中的ACL(Access Control List,...通过这两个配置举例,我们可以了解如何使用ACL来控制网络流量的访问权限,从而提高网络的安全性和可靠性。