linux操作系统网络服务器模型共享
所谓的并发服务器可以同时处理来自多个客户机的请求。循环服务器意味着服务器只能同时响应客户端的请求,而对于tcp和UDP套接字,这两个服务器的实现也有不同的特点。
1、tcp循环服务器:
首先,TCP服务器接受客户机的连接请求并处理连接请求。完成所有客户端的请求后,它断开,然后接受下一个客户端的请求,创建一个TCP循环服务器的算法如下:
复制代码代码如下所示:
插座(); / /创建一个TCP套接字
绑定(); / /端口号邦定的认可
听(); / /听客户端连接
同时(1)到接收客户端连接周期
{
接受(); / /接收当前的客户端连接
(1)
{当前客户机请求的处理
读();
过程();
写();
}
关闭(); / /当前客户的紧密联系,准备接收下一个客户端连接
}
TCP循环服务器一次只处理一个客户机请求。如果客户机占用服务器,其他客户端连接请求将不及时响应,因此,TCP服务器通常很少使用循环服务器模型。
2,tcp并发服务器:
并发服务器的思想是,服务器的主进程不直接处理每个客户端的请求,而服务器的主进程创建一个子进程,创建TCP并发服务器的算法如下所示:
复制代码代码如下所示:
插座(); / /创建一个TCP套接字
绑定(); / /端口号邦定的认可
听(); / /听客户端连接
当(1)到接收客户端接收到循环。
{
接受(); / /接收客户端连接
如果(叉(= = 0)) / /创造过程。
{
(1)
处理客户机连接的子进程
读();
过程();
写();
}
关闭(); / /关闭子进程的客户端连接
退出(); / /终止进程
}
关闭(); / /父进程关闭连接套接字描述符,准备接收下一个客户端连接
}
tcp并发服务器可以解决tcp环服务器中客户端的独占服务器的情况,但同时也带来了一个大问题,即响应客户端的请求,服务器要创建子进程来处理,而创建子进程是一个非常耗费资源的操作。
3、udp循环服务器:
UDP服务器每次从套接字读取客户机数据报请求,处理接收到的UDP数据报,并将结果返回给客户机:
1插座(); / /创建一个数据报套接字类型2绑定(hellip;hellip;); / /短口号键接受3,(1) / /接收客户端的连接4 { / /接收客户端的UDP数据报5(recvfrom)6;过程(hellip;hellip;发送邮件;7)(); / /准备8接收下一个客户端的数据}
消除线数
因为UDP不是面向连接的,所以没有客户端可以独占服务器。只要进程不是死循环,服务器对每个客户机的请求就可以被处理。
由于数据处理任务繁重,UDP循环服务器可能在数据报流量太大时丢失客户技术数据报告。但是由于UDP协议本身不能保证数据报的可靠到达,UDP协议被允许丢失数据报。
针对以上两点,一般UDP服务器使用循环模式4,UDP并发服务器将并发概念应用于UDP,并获得由tcp进程和并发TCP服务器模型创建的并发UDP服务器。
创建UDP并发服务器的算法如下:
复制代码代码如下所示:
插座(); / /创建一个数据报套接字类型
绑定(); / /短邦定接受的口号
当(1)到接收客户端连接时
接收和处理客户端UDP数据报
recvfrom();
如果(叉(= = 0)) / /创造过程。
{
过程();
sendto();
}
}
除非服务器花很长时间来处理客户机的请求,否则人们实际上很少使用这个UDP并发服务器模型。
4、多路复用I/O并发服务器:
创建子进程将带来大量的系统资源消耗。为了解决这个问题,使用了多路I/O模型的并发服务器,使用select函数创建多路I/O模型的并发服务器的算法如下:
初始化(套接字,绑定,监听);
复制代码代码如下所示:
(1)
{
设置侦听器读写文件描述符(fd_ *);
呼叫选择;
如果监听套接字已就绪,则将设置一个新的连接请求。
{
建立连接(接受);
添加到监视器文件描述符。
}
否则,描述是已连接的描述符。
{
操作(读或写);
}
多路复用I/O可以解决资源限制问题,这实际上是在tcp上使用udp循环模型,这也带来了一些问题,如服务器的顺序依次处理客户的请求,因此可能导致朋友的客户等待很长时间。