`
zsxxsz
  • 浏览: 452145 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用 acl 协程编写高并发网络服务

阅读更多

      本节从一个示例入手,介绍如何使用 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 服务

      个人微博:http://weibo.com/zsxxsz

       acl 下载:https://sourceforge.net/p/acl/

       github 地址:https://github.com/acl-dev/acl

       国内镜像:http://git.oschina.net/acl-dev/acl

      

       更多文章

       QQ 群:242722074

1
2
分享到:
评论

相关推荐

    实验:使用基本ACL限制公司网络访问.docx

    本实验"使用基本ACL限制公司网络访问"旨在让学生深入理解并掌握如何通过访问控制列表(ACL)来实现这一目标。实验主要涉及了eNSP(Enterprise Network Simulation Platform,企业网络模拟平台)、ACL、VLAN以及三层...

    使用基本ACL限制公司网络访问.rar

    3、应用场景:使用基本ACL限制公司网络访问 4、特点:Word文档提供了实验的详细过程,包括每一步骤的操作命令和截图,并给出了实验的topo文件(包括配置信息) 5、适用人群:网络系统的建设与运维 6、使用说明:重点...

    使用扩展ACL限制公司网络访问.rar

    3、应用场景:使用扩展ACL限制公司网络访问 4、特点:Word文档提供了实验的详细过程,包括每一步骤的操作命令和截图,并给出了实验的topo文件(包括配置信息) 5、适用人群:网络系统的建设与运维 6、使用说明:重点...

    NAT + VLAN +ACL管理企业网络

    为了满足这些需求,我们可以使用 NAT、VLAN 和 ACL 技术来管理企业网络。 首先,让我们来讨论 NAT 技术。NAT(Network Address Translation)是一种将私有地址转换为公共地址的技术。 在企业中,通常只有一个或几个...

    ACL 进行网络流量的控制1

    实验结果显示,使用 IP ACL 可以控制网络流量,使得网段 172.16.2.0 与 172.16.4.0 的主机可以进行通信,但网段 172.16.1.0 不允许访问 172.16.4.0 网段的主机。 知识点九:实验总结 实验总结显示,IP ACL 是实现...

    acl C++跨平台库.rar

    protocol(用 C 语言写的一些网络应用协议库)、lib_acl_cpp(用 C++ 语言编写,封装了 lib_acl/lib_protocol 两个库,同时增加更多实用的功能库)、 lib_fiber(用 C 语言编写的支持高性能、高并发的网络协程库)、...

    网络工程师单向访问控制ACL

    网络工程师在进行网络规划与管理时,经常需要实施单向访问控制(Access Control List, ACL),这是一种有效的网络安全策略,用于规范网络流量,确保数据的安全传输。本文将深入探讨单向访问控制ACL的概念、工作原理...

    掌握ACL的配置方法

    使用`ping`、`traceroute`、`telnet`和`debug`命令验证网络连通性和ACL的效果。 例如,如果要阻止PC1(1.1.1.200)访问DNS服务器(2.2.2.200),可以在R1的接口上配置一个扩展ACL,拒绝所有来自PC1的DNS请求(UDP...

    大学课堂《网络工程—ACL》

    《网络工程—ACL》课程是大学信息技术领域的重要组成部分,主要探讨如何通过访问控制列表(Access Control Lists,简称ACL)来管理网络流量,保障网络安全。ACL是网络设备如路由器和交换机上的一个重要功能,用于...

    acl框架库是一个C语言网络框架库,主要包含:服务器开发框架、同步异步网络通讯、常用数据结构、进程池线程池、流式xmljson

    1. **服务器开发框架**:ACL框架提供了一套完整的服务器开发工具,使得开发者可以快速构建高性能、高并发的网络服务。它包含了请求处理、连接管理、会话维护等核心模块,简化了网络服务器的开发流程。 2. **同步...

    acl 的使用方法

    使用 ACL 可以实现报文过滤、阻塞攻击报文、为不同类报文流提供差分服务等功能。ACL 的使用方法可以分为以下几个步骤: 1. 创建 ACL:创建 ACL 需要指定 ACL 的名称和编号。 2. 定义 ACL 规则:定义 ACL 规则需要...

    ACL在网络安全的应用仿真-网络安全论文-计算机论文.docx

    1.3 ACL使用原则 - **最小权限原则**:只授予完成任务所需的最低权限。 - **最靠近受控对象原则**:访问控制尽可能接近受控资源。 - **默认丢弃原则**:每个ACL末尾隐含一条拒绝所有其他流量的规则。 **2. ACL在...

    华为路由器ACL知识

    在华为路由器中,ACL可以被用于过滤数据包,限制特定IP地址、端口或服务的访问,从而实现对网络资源的精细化控制。 1. ACL的基本概念: - ACL是一个规则集合,这些规则定义了允许或拒绝的数据包的特定条件。 - 在...

    ACL在网络安全中应用仿真实验.pdf

    1.3 ACL使用原则 在配置ACL时需要遵循一定的原则,以确保安全性和网络的正常运行。首先,最小权限原则要求只授予需要执行任务的对象所必须的最小权限。其次,最近受控对象原则指的是实施网络层权限控制时,要尽量...

    计算机网络技术acl

    总的来说,ACL的使用是为了实现网络安全策略,限制特定源或目的地址的网络访问,保护网络资源免受恶意或未授权的访问。在这个场景中,通过定义ACL,我们可以确保只有特定的流量能够通过网络,提高网络的安全性和可控...

    ACL原理及配置(ACL原理)

    通过使用ACL,网络管理员能够根据特定的标准来过滤网络流量,从而实现精细化的网络管理。 - **作用**: - **过滤流量**: 根据源地址、目的地址、端口号等条件过滤进入或离开路由器的数据包。 - **安全控制**: 控制...

    锐捷交换机ACL配置

    在锐捷交换机上配置基于时间的ACL,可以进一步细化策略,使得规则只在特定的时间段内生效,这对于企业网络管理尤为实用,例如限制非工作时间的网络访问或特定服务。 基于时间的ACL配置主要涉及到以下几个关键概念:...

    华为Ensp,基本ACL,高级ACL,三层ACL,二层ACL,命名ACL配置大全.doc

    华为Ensp,基本ACL,高级ACL,三层ACL,二层ACL,命名ACL配置大全.doc

    思科路由器用自反访问控制列表(ACL)实现网段之间单向访问配置(设置)方法图解.docx

    ACL 可以应用于各种网络场景,例如企业网络、校园网络、数据中心等,用于控制网络流量的访问权限。 9. ACL 的优缺点 ACL 的优点是可以控制网络流量的访问权限,提高网络安全性;缺点是配置较为复杂,需要一定的网络...

    H3C交换机 典型配置举例-6W100-ACL典型配置举例

    "H3C交换机典型配置举例-6W100-ACL典型配置举例" 本文将详细介绍H3C交换机中的ACL(Access Control List,...通过这两个配置举例,我们可以了解如何使用ACL来控制网络流量的访问权限,从而提高网络的安全性和可靠性。

Global site tag (gtag.js) - Google Analytics