之前写过一些如何使用 acl 的服务器框架编写服务器程序的技术文章(http://zsxxsz.iteye.com/category/210570,http://zsxxsz.iteye.com/category/80224),如果仅是写一些简单的服务器程序,有时倒不必如此麻烦, acl 的 C++ 库部分也提供了一些简单的服务器类,本文将介绍如何使用这些简单的类来实现一些服务器程序和网络客户端程序。
首先介绍 acl 中的服务器类:server_socket。该类定义了如下几个简单方法:
/** * 开始监听给定服务端地址 * @param addr {const char*} 服务器监听地址,格式为: * ip:port;在 unix 环境下,还可以是域套接口,格式为: * /path/xxx * @return {bool} 监听是否成功 */ bool open(const char* addr); /** * 关闭已经打开的监听套接口 * @return {bool} 是否正常关闭 */ bool close(); /** * 接收客户端连接并创建客户端连接流 * @param timeout {int} 在阻塞模式下,当该值 > 0 时,采用超时 * 方式接收客户端连接,若在指定时间内未获得客户端连接,则返回 NULL * @return {socket_stream*} 返回空表示接收失败 */ socket_stream* accept(int timeout = 0); /** * 获得监听的地址 * @return {const char*} 返回值非空指针 */ const char* get_addr() const { return addr_; }
使用上述网络服务类的步骤是:调用 open 监听本机的一个网络地址(如果是UNIX平台,还可以监听UNIX域套接口)------> 调用 accept 方法等待远程客户端连接本服务器 ------> 当服务器程序接收到客户端连接时 accept 方法返回客户端连接网络流(socket_stream) ------> 启动一个线程处理这个客户端连接。下面为一个简单的服务器程序:
#include "acl_cpp/lib_acl.hpp" // 处理客户端连接的线程类 class client_thread : public acl::thread { public: client_thread(acl::socket_stream* client) : client_(client) { } ~client_thread() { delete client_; } protected: // 实现基类 acl::thread 中定义的纯虚方法 void* run() { acl::string buf; while (true) { // 从客户端连接读一行数据,第二个参数为 false 意思是希望 // socket_stream 在读到一行数据时保留 \r\n if (client_->gets(buf, false) == false) return NULL; printf("gets one line: %s", buf.c_str()); // 回写所读到的一行数据 if (client_->write(buf) == -1) return NULL; } } private: acl::socket_stream* client_; }; int main(void) { const char* addr = "0.0.0.0:8080"; acl::socket_server server; // 监听本机网络地址 if (server.open(addr) == false) { printf("listen addr: %s error: %s\r\n", addr, acl::last_serror()); return -1 } while (true) { // 等待客户端连接本服务器程序 acl::socket_stream* client = server.accept(); if (client == NULL) { printf("accept error: %s\r\n", acl::last_serror()); return -1; } // 创建一个子线程用来处理该客户端连接 client_thread* thread = new client_thread(client); // 将线程设为分离模式,这样当线程退出时会自行释放线程相关资源 thread->set_detachable(true); // 启动该线程 thread->start(); } return 0; }
上面例子非常简单,毋庸详述,关于如何使用 acl 编写多线程程序,请参照:使用 acl_cpp 库编写多线程程序。下面再给出一个简单的网络客户端例子:
#include "acl_cpp/lib_acl.hpp" int main(void) { const char* server_addr = "127.0.0.1:8080"; int conn_timeout = 10 /* 连接服务器超时时间,单位:秒 */ int rw_timeout = 10 /* 网络 IO 超时时间,单位:秒 */; acl::socket_stream conn; // 连接远程服务器 if (conn.open(server_addr, conn_timeout, rw_timeout) == false) { printf("connect server: %s error: %s\r\n", server_addr, acl::last_serror()); return -1; } const char* req = "hello world!\r\n"; acl::string buf; // 向服务器写一行数据,同时从服务器读一行数据,循环 10 次 for (int i = 0; i < 10; i++) { // 向服务器发送一行数据 if (conn.write(req, strlen(req)) == -1) { printf("write request to server error: %s\r\n", acl::last_serror()); return -1; } // 从服务器读一行数据,注:第二个参数为默认的 true,意思是获得 // 一行数据后自动将尾部的 \r\n 去掉 if (conn.gets(buf) == false) { printf("gets one line from server error: %s\r\n", acl::last_serror(); return -1; } printf("response: %s\r\n", buf.c_str()); } return 0; }
参考链接:
技术博客:http://zsxxsz.iteye.com/
download:http://sourceforge.net/projects/acl/
svn:svn checkout svn://svn.code.sf.net/p/acl/code/trunk acl-code
github:https://github.com/acl-dev/acl
QQ 群:242722074
相关推荐
在实际应用中,ACL库常被用于开发高并发的网络服务,例如Web服务器、FTP服务器、代理服务器等。它的线程池和进程池机制能够有效地处理大量并发连接,保证服务的稳定性和响应速度。同时,其对HTTP、ICMP和DNS协议的...
SVN客户端是开发者用来与SVN服务器交互的工具,它提供了诸如添加、提交、更新、合并、回滚等基本功能。在提供的压缩包中,包括了32位和64位的SVN客户端安装包,以适应不同操作系统环境。客户端安装步骤通常包括下载...
通过理解和实践这些知识点,你将能够在Linux环境中熟练地使用C++进行MQTT开发,实现高效的发布和接收功能,并确保应用程序的稳定性和可靠性。在实际项目中,还需要根据具体需求进行扩展和定制,如添加心跳检测、实现...
通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...
综上所述,Subversion服务器和客户端安装文件提供了在团队中实现有效版本控制的基础,通过合理的配置和使用,可以极大地促进协同开发并保障代码的安全和质量。在实际项目中,还需要根据具体需求和团队规模选择合适的...
【CVS服务器+客户端】是版本控制系统CVS(Concurrent Versions System)在Windows平台上的应用,主要用于协同开发和管理代码库。CVS是一种开源的、网络化的版本控制系统,它允许多个开发者同时对同一份代码进行修改...
用java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和...
标题“lua and acl example”揭示了本主题是关于使用Lua脚本语言与Access Control Lists (ACL)相结合的一个示例。Lua是一种轻量级的、解释型的编程语言,常用于游戏开发、配置文件、服务器应用等领域。而ACL则通常...
在IT行业中,网络与服务器编程框架库是构建高效、稳定且可扩展的网络服务的核心工具。这些库提供了丰富的功能,使开发者能够轻松处理网络通信、数据传输和服务器管理等复杂任务。下面我们将深入探讨网络通信库和...
通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、...
- **项目发布**:在IDEEngineer中完成项目的开发后,可以使用发布功能将项目发布到指定的目录或服务器上,供客户端访问。 - **安全设置**:根据实际需求,设置访问控制列表(ACL),以实现对不同用户的访问权限控制...
在VB6.0环境下,FTP(File Transfer Protocol)服务器的管理是一个常见的任务,尤其是在开发企业级应用程序时。VB6提供了一种方式来实现对FTP服务器的控制,这主要通过使用Winsock控件或者第三方库来实现。下面我们...
客户端是Zookeeper与用户交互的主要界面,理解其工作原理和使用方法对于开发和维护分布式应用至关重要。本篇文章将深入探讨Zookeeper客户端的相关知识点。 1. **客户端连接** Zookeeper客户端通过TCP连接到...
ACL项目是一个综合性的软件开发项目,其核心是提供一套通用且跨平台的函数库,旨在简化和优化IT领域的多个关键领域。这个项目包含了多种功能模块,如网络通信、服务器框架、进程池和线程池管理,以及通用算法实现。...
在IT行业中,客户端-服务器(Client-Server)架构是一种广泛应用于网络通信的模型,它将应用程序分为两个主要部分:客户端和服务器。在这个架构中,客户端是用户与系统交互的界面,而服务器则处理请求并提供服务。...
5. **API使用**:除了命令行工具,ZooKeeper还提供了一套丰富的Java API,使得开发者能够在应用程序中直接与ZooKeeper服务器通信。这些API支持异步和同步的操作模式,能够满足不同场景的需求。 6. **安全性**:...
在IT领域,代理服务器是一种重要的网络工具,它作为客户端与目标服务器之间的中介,可以实现数据转发、访问控制、隐私保护等功能。在这个主题中,我们主要关注一个使用C++编程语言编写的简单代理服务器源码。C++是...
作为MSMQ客户端,它允许应用程序通过发送和接收消息与其他MSMQ服务器或客户端进行通信,即使目标系统暂时不可达或者网络连接不稳定也能确保消息的传输。 在MSMQ客户端开发中,核心知识点主要包括以下几个方面: 1....