当前位置: 首页 > news >正文

计算机网络-服务器模型

一.服务器模型

1.支持多客户端访问 

//单循环服务器 
socket
bind
listen
while(1)
{    
    accept
    while(1)
    {
      recv/send
    }
}
close

注:该模式remvform为阻塞态,服务器将等待接收数据


2..支持多客户端同时访问 (并发能力)


socket
bind
listen
while(1)
{    
    connf = accept
    pid_t pid = fork();
    //出错处理
    if (pid == 0)
    {
        while(1) //负责 与 客户端通信的 
        { 
          recv/send
        }
    }
}
close

注:将管道设置成非阻塞一直读取

读端设置非阻塞

//线程

void *handle_client(void *arg)
{
       while(1) //子线程中 负责 与 客户端通信的 
        { 
          recv/send
        }
}


socket
bind
listen
while(1)
{    
    connf = accept
    pthread_create();
    //出错处理
}
close

二,三种服务器模型:

1.单循环服务器 
2.并发服务器 


  进程 
  线程 
  

        1、简单循环服务器
            http 
            web 服务器,apache--》cgi,php,perl,IIS--》asp,NGIX,Nlighty
            
            while(1)
            {
                newfd = accept();
                    recv();
                close(newfd);
            }

            特点:可以接入多个客户端的信息。
            缺点:数据通信过程短,客户端只能一次有效。
                  实时性效果差。

        2、fork循环服务器===>每次有链接则fork一个子进程为该
                            链接处理通信过程,父进程继续等待新链接。

            while(1)
            {
                newfd  = accept();
                pid = fork()
                if(pid  == 0)
                {
                    ///接收数据
                }
                if(pid < 0)
                {
                    perror("fork");
                    return -1;
                }
                waitpid()
            }
            
            特点:可以完成多个进程的实时交互,信息的完整性可以保证。

            缺点:回收资源不方便,每次fork 占用系统资源多。
                  可能出现僵尸进程
                  
            多线程:
               特点:
                   创建速度快,调度快 
               缺点:
                   线程共享进程资源,稳定性,安全性 较差 


                   
      3.并发的服务器模型 ---更高程度上的并发 
      


      IO模型 
      阻塞IO
      非阻塞IO 
      
      
      
    1、阻塞IO  
       用的最多。
       读阻塞。
       写阻塞。
    2、非阻塞IO 
         -1 errno EAGAIN  whild(1){read()break;}忙等待
        contro

注:信号驱动IO


    4.SELECT函数并发

#include <unistd.h>
    #include <fcntl.h>
    int fcntl(int fd, int cmd, ... /* arg */ );
    功能:修改指定文件的属性信息。
    参数:fd 要调整的文件描述符
          cmd 要调整的文件属性宏名称
          ... 可变长的属性值参数。
    返回值:成功  不一定,看cmd
            失败  -1;
              
              
    int fcntl(int fd, int cmd, ... /* arg */ );

     //驱动:     
     //1.驱动程序 ---- 驱使硬件工作起来的程序 
     让灯亮起来 
     
     //2.应用程序 
     应用程序 
     led_ctnl(led_fd,ON );
     led_ctnl(led_fd,OFF );
     led_ctnl(led_ctnl,STREAM); //流水灯 


    eg:修改文件的非阻塞属性:
        int flag ;
        flag  = fcntl(fd,F_GETFL,0);  ///获取fd文件的默认属性到flag变量中。
        flag  = flag | O_NONBLOCK;    ///将变量的值调整并添加非阻塞属性
        fcntl(fd,F_SETFL,flag);       ///将新属性flag设置到fd对应的文件生效。

        以上代码执行后的阻塞IO将变成非阻塞方式。
        


        
    

相关文章:

  • labelimg标注的xml标签转换为yolo格式标签
  • TMS320F28P550SJ9学习笔记4:导入其余包文件
  • 若依ry-vue分离板(完整版)前后端部署
  • AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革
  • 元宇宙崛起:区块链与金融科技共绘数字新世界
  • RuleOS:DApp开发的“破局者”,区块链创新的“加速器
  • 从零开始的远程服务器跑深度学习(一)
  • 【基础1】冒泡排序
  • ERNIE 3.0: 大规模知识增强的预训练语言理解和生成框架
  • 【Minio】Docker部署Minio + 使用nginx配置https访问
  • 【漫话机器学习系列】124.感知机(Perceptron)
  • vue3中emits
  • 【预测】-双注意LSTM自动编码器记录
  • 职坐标机器学习编程实战:调试优化与自动化测试精要
  • 【C语言】指针篇
  • Python | 机器学习中最常用的超参数及使用示例
  • window系统中的start命令详解
  • SSM架构 +Nginx+FFmpeg实现rtsp流转hls流,在前端html上实现视频播放
  • RSA-OAEP填充方案与定时攻击防护
  • 人工智能之数学基础:对线性代数中逆矩阵的思考?
  • angularjs做网站/吉安seo
  • .东莞网站建设/交换友情链接的条件
  • 网站建设品/广安百度推广代理商
  • 网站制作公司兴田德润简介/用广州seo推广获精准访问量
  • c 网站登录验证码怎么做/知识搜索引擎
  • seo自己做网站吗/今日热点新闻事件摘抄2022