zoukankan      html  css  js  c++  java
  • Linux服务器模型及其对应的程序流程

    一、TCP循环服务器

    TCP循环服务器一次只能处理一个客户端的请求,处理完成后,才能接受下一个客户端的请求,程序流程如下:

    socket(......);//创建套接字
    bind(......);//绑定到某端口
    listen(......);//监听客户端连接
    while(1)//循环处理客户端的请求
    {
            accept(......);//接受一个客户端连接
            while(1)//处理客户端的请求
            {   
                    recv(......);
                    process(......);
                    send(......);
            }
            close(......);//关闭当前客户端连接
    }        

    二、UDP循环服务器

    UDP循环服务器每次从套接字上读取一个客户端的请求并处理,然后将结果返回给客户机,程序流程如下:

    socket(......);//创建套接字
    bind(......);//绑定到某端口
    while(1)循环处理客户端的请求
    {
            recvfrom(......);
            process(......);
            sendto(......);
    }

    三、并发处理器

    并发处理器是指服务器在同一个时刻可以响应多个客户端的请求,他的思想是每一个客户端的请求并不由服务器进程直接处理,而是创建一个子进程来处理,这可以弥补TCP循环服务器容易出现某个客户端独占服务端的缺陷,程序流程如下:

    socket(......);//创建套接字
    bind(......);//绑定到某端口
    listen(......);//监听客户端连接
    while(1)//循环处理客户端的请求
    {
            accept(......);//接受一个客户端连接
            if(fork(......)==0)//创建子进程
            {
                    while(1)//处理客户端的请求
                    {        
                            recv(......);
                            process(......);
                            send(......);
                    }
                    close(......);//关闭当前客户端的连接
                    exit(......);//子进程退出
            }
            close(......);//父进程关闭连接套接字,准备接受下一个客户端连接
    }

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

    多路复用I/O并发服务器是为了解决创建子进程带来的系统资源消耗问题而提出的,前面几种服务器都是阻塞方式的套接字,使用阻塞方式的套接字,进程的效率比较低,尤其是进行读写操作时。我们可以使用fcntl()或ioctl()函数来改变套接字的属性,将其设置为无阻塞方式,程序流程如下:

    socket(......);//创建套接字
    bind(......);//绑定到某端口
    listen(......);//监听客户端连接
    while(1)//循环处理客户端的请求
    {
        FD_SET(......);//设置监听读写文件描述符
        switch(select(......))//调用select函数
        {
        case -1://发生错误,退出
            exit(1);
        case 0://超时
            break;
        default:
            if(.....)//新的连接请求建立
            {
                accept(......);//接受一个客户端连接
                FD_SET(......);//将连接套接字加入到监听文件描述符集合中
            }
            else//可读写的为一个已经创建过连接的描述符
            {
                ......//读写套接字
            }
        }
    }
  • 相关阅读:
    范内瓦·布什发表《诚如所思》,被信息界公认为是信息科学经典之作
    1968年12月9日,恩格尔巴特公开演示了世界上第一个鼠标盒子
    最后一台小型机下线 阿里巴巴如何“去IOE”
    阿里云确认向12306提供了技术协助,负责承接12306网站75%的余票查询流量
    Weka Experimenter(实验者界面) 简解
    数理统计中 极大似然 的含义简介(举例说明)
    Weka Knowledge Flow(知识流界面) 详解
    Weka Explorer(探索者界面) 详解(4)logistic回归和回归算法
    Weka Explorer(探索者界面) 详解(3)决策树算法,分类器评价标准说明
    Weka Explorer(探索者界面) 详解(2)
  • 原文地址:https://www.cnblogs.com/zlgxzswjy/p/5408037.html
Copyright © 2011-2022 走看看