当前位置:主页   - 电脑 - 程序设计 - C/C++
利用ACL开发并发网络服务器
来源:网络   作者:zsxxsz   更新时间:2011-09-03
收藏此页】    【字号    】    【打印】    【关闭

  1、概述

  本节结合 "利用ACL库开发高并发半驻留式线程池程序" 和 "利用ACL库快速创建你的网络程序" 两篇文章的内容,创建一个简单的线程池网络服务器程序。

  2、并发式网络通信实例

  C代码

#include "lib_acl.h" /* 先包含ACL库头文件 */ 
#include <stdio.h> 
#include <stdlib.h> 
 
/** 
 * 单独的线程处理来自于客户端的连接 
 * @param arg {void*} 添加任务时的对象 
 */ 
static void echo_client_thread(void *arg) 
{ 
 ACL_VSTREAM *client = (ACL_VSTREAM*) arg; 
 char buf[1024]; 
 int  n; 
 
 /* 设置客户端流的读超时时间为30秒 */ 
 ACL_VSTREAM_SET_RWTIMO(client, 30); 
 
 /* 循环读客户端的数据,直到其关闭或出错或超时 */ 
 while (1) { 
 /* 等待读客户端发来的数据 */ 
 n = acl_vstream_read(client, buf, sizeof(buf)); 
 if (n == ACL_VSTREAM_EOF) 
  break; 
 /* 将读到的数据写回至客户端流 */ 
 if (acl_vstream_writen(client, buf, n) == ACL_VSTREAM_EOF) 
  break; 
 } 
 
 /* 关闭客户端流 */ 
 acl_vstream_close(client); 
} 
 
/** 
 * 创建半驻留线程池的过程 
 * @return {acl_pthread_pool_t*} 新创建的线程池句柄 
 */ 
static acl_pthread_pool_t *create_thread_pool(void) 
{ 
 acl_pthread_pool_t *thr_pool; /* 线程池句柄 */ 
 int max_threads = 100; /* 最多并发100个线程 */ 
 int idle_timeout = 10; /* 每个工作线程空闲10秒后自动退出 */ 
 acl_pthread_pool_attr_t attr; /* 线程池初始化时的属性 */ 
 
 /* 初始化线程池对象属性 */ 
 acl_pthread_pool_attr_init(&attr); 
 acl_pthread_pool_attr_set_threads_limit(&attr, max_threads); 
 acl_pthread_pool_attr_set_idle_timeout(&attr, idle_timeout); 
 
 /* 创建半驻留线程句柄 */ 
 thr_pool = acl_pthread_pool_create(&attr); 
 assert(thr_pool); 
 return (thr_pool); 
} 
 
/** 
 * 开始运行 
 * @param addr {const char*} 服务器监听地址,如:127.0.0.1:8081 
 */ 
static void run(const char *addr) 
{ 
 const char *myname = "run"; 
 acl_pthread_pool_t *thr_pool; 
 ACL_VSTREAM *sstream; 
 char ebuf[256]; 
 
 thr_pool = create_thread_pool(); 
 
 /* 监听一个本地地址 */ 
 sstream = acl_vstream_listen(addr, 128); 
 if (sstream == NULL) { 
 printf("%s(%d): listen on %s error(%s)\r\n", 
  myname, __LINE__, addr, 
  acl_last_strerror(ebuf, sizeof(ebuf))); 
 return; 
 } 
 
 printf("%s: listen %s ok\r\n", myname, addr); 
 while (1) { 
 /* 等待接受客户端的连接 */ 
 client = acl_vstream_accept(sstream, NULL, 0); 
 if (client == NULL) { 
  printf("%s(%d): accept error(%s)\r\n", 
   myname, __LINE__, 
   acl_last_strerror(ebuf, sizeof(ebuf))); 
  break; 
 } 
 printf("accept one\r\n"); 
 /* 获得一个客户端连接流 */ 
 /* 开始处理该客户端连接流 */ 
 
 /** 
  * 向线程池中添加一个任务 
  * @param thr_pool 线程池句柄 
  * @param echo_client_thread 工作线程的回调函数 
  * @param client 客户端数据流 
  */ 
 acl_pthread_pool_add(thr_pool, echo_client_thread, client); 
 } 
 
 /* 销毁线程池对象 */ 
 acl_pthread_pool_destroy(thr_pool); 
} 
 
/** 
 * 初始化过程 
 */ 
static void init(void) 
{ 
 /* 初始化ACL库 */ 
 acl_init(); 
} 
 
/** 
 * 使用提示接口 
 * @param procname {cosnt char*} 程序名 
 */ 
static void usage(const char *procname) 
{ 
 printf("usage: %s listen_addr\r\n", procname); 
 printf("example: %s>127.0.0.1:8081\r\n", procname); 
 getchr();  
} 
 
int main(int argc, char *argv[]) 
{ 
 if (argc != 2) { 
 usage(argv[0]); 
 return (0); 
 } 
 
 init(); 
 run(argv[1]); 
 return (0); 
}

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明