您的位置:首页 > 理论基础 > 计算机网络

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

2017-04-19 00:13 288 查看

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函数的参数说明如下。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: