电脑技术吧

会员投稿 会员登录 会员注册 网站公告:
搜索: 您现在的位置主页 > 亚博ios下载地址 > Linux > Linux应用 > 正文

Linux Socket 学习(十一)

作者:admin    文章来源:互联网 电脑技术吧     点击数:    更新时间:2011-09-22
收藏】 【挑错】 【推荐】 【打印

并发客户端服务器

到现在为止我们所介绍的这些服务器 程序,在接受下一个客户端连接之前只处理一个客户端请求。这对于即时回复的服务器来说是高效且简单的。然而,如果处理要花费较长时间,或者有一段不活动时 期,这样的设计就会无限制的阻止其他客户端的连接。因为服务器通常在最小的延迟时间内服务尽可能多的客户端,在服务器的连接端需要一个基础设计的改变。

在这一章,我们将会学到下面的一些内容:
为处理多个客户端连接使用fork(2)函数
wait(2)与waitpid(2)函数
处理多个客户端连接的select(2)函数

掌握了这些内容可以使得我们编写一次处理大量客户端的专业级服务器。

理解多客户端的问题

图11.1显示了多个客户端连接到同一个服务器的情况。

图11.1中心的服务器必须在多个连接的客户端之前平衡资源。服务器通常设计来使得每一个客户端认为自己独占服务器访问。然而,事实上,服务器以一种并发的方式来服务所有的客户端。

可以用下面的方法来实现这样的目的:
派生(fork)服务器进程(多进程方法)
线程化服务器进程(多线程方法)
一个进程与一个select调用
一个进程与一个poll(2)调用 本文来自织梦

使用fork系统调用的第一种方法也许是服务多客户端进程的最简单的方法。然而,他的缺点是信息的共享变得更为复杂。这通常需要使用消息队列,共享内存以及信号量。他的另一个缺点就是需要CPU为每一个请求启动并管理一个新的进程。

线程化服务器的方法对于UNIX而言是较新的方法,对于Linux也是一个新的选项。线程提供了多进程方法的轻量优点,而不会阻碍中心的通信。然而,线程处理难于高度,尤其对于编程新手而言尤其如此。因为这个原因,在这里我们并不会讨论线程的相关内容。

最后两种方法需要调用select或poll函数调用。每一个函数都提供了一个不同的方法来阻塞服务的运行,直到有事情发生。我们在这一章将会详细讨论select函数。感兴趣的读者可以阅读poll手册页来了解poll的相关内容。

使用fork(2)来服务多个客户端

在这里我们会使用fork函数修改在第10章所开发的服务器程序来处理多个客户端。下面的代码为修改过的rpnsrv.c模块。其他的代码与前一章的代码相同。
/*rpnsrv.c
 *
 * Example RPN Server:
 */
#include
#include
#include

内容来自dedecms

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#ifndef SHUT_RDWR
#define SHUT_RDWR 3
#endif

extern int mkaddr(void *addr,
 int *addr_len,
 char *input_address,
 char *protocol);

extern void rpn_process(FILE *tx,
 char *buf);

/*
 * Process Terminated Child processes:
 */
static void sigchld_handler(int signo)
{
  pid_t PID;
  int status;

  do
  {
 PID = waitpid(-1,, [5] [6] [7] [8] [9] [10] [11] [12] [13]$False$

&status,WNOHANG);
  }while(PID != -1);

发表评论 请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名:密码:新注册匿名
评论总数: [ 查看全部 ] 网友评论
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 在线帮助