Linux--网络编程-常见服务器模型

1、UDP循环服务器

 UDP循环服务器的实现非常简单,UDP服务器每次从套接字上读取一个客户端的请求进行处理,然后将结果返回客户端,可以用下面的算法来实现。

soket(...);
bind(...);
while(1)
{
    recvfrom(...);
    process(...);
    sendto(...);
}

 因为UDP是非面向连接的,因此没有一个客户端可以一直占用服务端,只要处理过程不是死循环,服务器对于每一个客户端的请求总是能够满足的。


2、TCP循环服务器

 TCP循环服务器实现也不难,TCP服务器接收一个客户端的连接,然后处理,完成了这个客户端的所有请求后断开连接,其算法如下。

socket(...);
bind(...);
listen(...);
while(1)
{
    accept(...);
    while(1)
    {
        read(...);
        process(...);
        write(...);
    }
    close(...);
}

 TCP循环服务器一次只能处理一个客户端的请求,只有在这个客户端的所有请求都满足后,服务器才可以继续后面的请求,这样如果有一个客户端占用服务器不放,则其他的客户端就都不能工作了,因此TCP服务器一般很少用循环服务器模型。


3、TCP并发服务器

 TCP并发服务器的思想是每一个客户端的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理,其基本模型如下。

socket(...);
bind(...);
listen(...);
while(1)
{
    accpet(...);
    if(fork(...) == 0)
    {
        process(...);
        close(...);
        exit(...);
    }
    close(...);
}

 TCP并发服务器可以解决TCP循环服务器客户端独占服务器的情况,不过同时也带来了一个不小的问题,为了响应客户端的请求,服务器要创建子进程来处理,而创建子进程是非常消耗资源的操作。


4、UDP并发服务器

 将并发的概念用于UDP就得到了并发UDP服务器模型,与并发TCP服务器模型一样,并发UDP服务器模型将创建一个子进程来处理客户端的请求,算法和并发的TCP模型一样,其基本的模型如下。

socket(...);
bind(...);
while(1)
{
    recvfrom(...);
    if(fork(...) == 0)
    {
        process(...);
        sendto(...);
    }
}

 除非服务器在处理客户端的请求所用的时间比较长,否则人们实际上很少用这种模型。


5、多路复用I/O并发服务器

 为了解决创建子进程带来的系统资源消耗,人们又想出了多路复用I/O模型。
 首先介绍一个select函数,该函数及其有关宏的定义如下:

int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout)
void FD_SET(int fd, fd_set *fdset)
void FD_CLR(int fd,fd_set *fdset)
void FD_ZERO(fd_set *fdset)
int FD_ISSET(int fd, fd_set *fdset)

 一般来说当读/写网络套接字时,进程有可能在读/写时阻塞,直到一定的条件满足。比如从一个套接字读数据时,可能缓冲区里面没有数据可读(通信的对方还没有发送数据过来),这时的读调用就会等待(阻塞)直到有数据可读。如果不希望阻塞,可以使用select系统调用,只要设置好select的各个参数,则当下网络套接字可以读/写时select将“通知”我们可以读/写了。select函数的参数说明如下。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页