tcp并发服务端

Linux系统网络服务器模型主要有两种:并发服务器和循环服务器。
 
所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服务器是指服务器在同一时刻指可以响应一个客户端的请求。而且对于TCP和UDP套接字,这两种服务器的实现方式也有不同的特点。
 
1、TCP循环服务器:
 
首先TCP服务器接受一个客户端的连接请求,处理连接请求,在完成这个客户端的所有请求后断开连接,然后再接受下一个客户端的请求。
 
创建TCP循环服务器的算法如下:socket(……); //创建一个TCP套接字bind(……);
//邦定公认的端口号listen(……); //倾听客户端连接while(1)
//开始循环接收客户端连接{ accept(……);//接收当前客户端的连接while(1)
 
{ //处理当前客户端的请求read(……);process(……);write(……);} close(……);
//关闭当前客户端的连接,准备接收下一个客户端连接}
TCP循环服务器一次只处理一个客户端的请求,如果有一个客户端占用服务器不放时,其它的客户机连接请求都得不到及时的响应。因此,TCP服务器一般很少用循环服务器模型的。
 
2、TCP并发服务器:  
并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理。
 
创建TCP并发服务器的算法如下:socket(……); //创建一个TCP套接字bind(……);
//邦定公认的端口号listen(……);//倾听客户端连接while(1)
//开始循环接收客户端的接收{
accept(……);//接收一个客户端的连接if(fork(……)==0) //创建子进程{
while(1)
 
{ //子进程处理某个客户端的连接read(……);process(……);write(……);}
close(……); //关闭子进程处理的客户端连接exit(……) ;//终止该子进程}
close(……); //父进程关闭连接套接字描述符,准备接收下一个客户端连接}
TCP并发服务器可以解决TCP循环服务器客户端独占服务器的情况。但同时也带来了一个不小的问题,即响应客户机的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作。
 
3、UDP循环服务器:  
UDP服务器每次从套接字上读取一个客户端的数据报请求,处理接收到的UDP数据报,然后将结果返回给客户机。
 
创建UDP循环服务器的算法如下:socket(……);
//创建一个数据报类型的套接字bind(……); //邦定公认的短口号while(1)
//开始接收客户端的连接{
//接收和处理客户端的UDP数据报recvfrom(……);process(……);sendto(……);//准备接收下一个客户机的数据报}因为UDP是非面向连接的,没有一个客户端可以独占服务器。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够处理的。
 
UDP循环服务器在数据报流量过大时由于处理任务繁重可能造成客户技数据报丢失,但是因为UDP协议本身不保证数据报可靠到达,所以UDP协议是允许丢失数据报的。
 
鉴于以上两点,一般的UDP服务器采用循环方式4、UDP并发服务器把并发的概念应用UDP就得到了并发UDP服务器,和并发TCP服务器模型一样是创建子进程来处理的。
 
创建UDP并发服务器的算法如下:socket(……);
//创建一个数据报类型的套接字bind(……); //邦定公认的短口号while(1)
//开始接收客户端的连接{
//接收和处理客户端的UDP数据报recvfrom(……);if(fork(……)==0) //创建子进程{
process(……);sendto(……);}除非服务器在处理客户端的请求所用的时间比较长以外,人们实际上很少用这种UDP并发服务器模型的。
 
  4、多路复用I/O并发服务器:  
创建子进程会带来系统资源的大量消耗,为了解决这个问题,采用多路复用I/O模型的并发服务器。采用select函数创建多路复用I/O模型的并发服务器的算法如下:
 
初始化(socket,bind,listen);while(1)
 
{设置监听读写文件描述符(FD_*);调用select;如果是倾听套接字就绪,说明一个新的连接请求建立{建立连接(accept);加入到监听文件描述符中去;}否则说明是一个已经连接过的描述符{进行操作(read或者write);}多路复用I/O可以解决资源限制问题,此模型实际上是将UDP循环模型用在了TCP上面。这也会带了一些问题,如由于服务器依次处理客户的请求,所以可能导致友的客户会等待很久。

www.hj8828.com,TCP并发服务器:并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理。

第二章 Linux网络编程

所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服…

    创建TCP并发服务器的算法如下:

2.1客户——服务器模型

    socket(……); //创建一个TCP套接字

目前大多数网络应用程序在编写时都采用客户—服务器模型,假设一端是客户,另一端是服务器,让服务器提供给客户一定的服务内容。它要求有一方(服务器方)在启动执行程序后(无限期地)等待其他客户端程序与之通信。这里可以再分为两种具体类型:并发型交互与重复型交互。

    bind(……);    //邦定公认的端口号

(1)并发型交互。在并发型交互模式下,程序的主要运作步骤如下:

    listen(……);//倾听客户端连接

·等待一个客户请求的到来;

    while(1)       //开始循环接收客户端的接收

·生成一个新的进程或者任务来处理这个客户请求,同时这里还可以接收其他客户的请求,处理结束后,终止这个进程;

   {

·反馈客户端;

                accept(……);//接收一个客户端的连接

·等待新的客户请求的到来并进行下一次服务,如此循环运作。

                if(fork(……)==0)  //创建子进程

(2) 重复型交互。重复型交互模式下,程序的主要运作步骤如下:

                {                  

·等待一个客户请求的到来;

                         while(1)

·处理客户的请求,对客户进行服务;

                             {             //子进程处理某个客户端的连接

·给客户反馈信息,服务结束;

                                   read(……);

·等待下一个请求到来,如此循环。

                                   process(……);

这里重复型交互的缺点就是在服务器给一个客户处理请求服务的时候,不能接收和处理其他客户的请求;而并发型交互就可以解决这个问题,但要多线程操作系统的支持。一般来说,UDP
服务器采用重复型交互,TCP 服务器采用并发型交互。
客户/服务器模式要求每个应用程序由两个部分组成:一个部分负责启动通信,另一个部分负责对它进行应答。它们通常是运行在不同的主机上,分别被称为客户机和服务器。服务器并不特定指网络上的一台机器,它可以是网络上可提供服务的任何程序,同样,客户机也是指用户为了得到某种服务所需要运行的应用程序。由于客户端和服务器端在网络通信中表现出来的不同的功能,对它们编程要采用不同的算法。

                                   write(……);

2.2面向连接和无连接的客户—服务器

                              }

  
在设计客户—服务器软件时,必须在两种类型的交互中做出选择:无连接的风格或面向连接的风格。这两种风格的交互直接对应于
TCP/IP
协议族所提供的两个主要的传输协议。如果客户和服务器使用用户数据报(UDP)进行通信,那么交互就是无连接的;如果使用传输控制协议(TCP),则交互就是面向连接的。由于面向连接风格的交互协议使编程更简单,程序更可靠,因此采用TCP协议的客户—服务器模型是我们的首选。

                             close(……);  //关闭子进程处理的客户端连接

2.3 TCP 连接通讯过程

                              exit(……) ;//终止该子进程

TCP是一种面向连接的、可靠的字节流传输协议,通讯之前,双方之间必须建立一条连接,通讯结束后再释放。

                    }

为了建立一条可靠的连接,TCP采用三次握手的方式:

                 close(……);           //父进程关闭连接套接字描述符,准备接收下一个客户端连接

(1)客户机(请求端)向服务器发出同步段(SYN),请求接入。