zoukankan      html  css  js  c++  java
  • 迭代服务器 和 并发服务器 的程序框架

    前言

    大多数TCP服务器是并发的,大多数UDP服务器是迭代的。

    如果服务一个客户请求的时间不长,使用迭代服务器没有太大问题,一旦客户请求的时间需要花费很长,不希望整个服务器被单个客户长期占用,而希望同时服务多个客户,就需要选择并发服务器了。

    迭代服务器程序框架

    int listenfd,connfd;
    listenfd = socket( ... );
    bind(listen, ... );
    listen(listenfd,LISTENQ);
    for(;;)
    {
        connfd = accept(listenfd, ... );
        doit(connfd);
        close(connfd);
    }

    并发服务器程序框架

    pid_t pid;
    int listenfd,connfd;
    listenfd = socket( ... );
    bind(listen, ... );
    listen(listenfd,LISTENQ);
    for(;;)
    {
        connfd = accept(listenfd, ... );
        if((pid = fork()) == 0)
        {
            close(listenfd);    /* child closes listening socket */
            doit(connfd);       /* process the request */
            close(connfd);      /* done with this client */
            exit(0);            /* child terminates
        }
        close(connfd);          /* parent closes connected socket */
    }

    注意

    每个文件和套接字都有一个引用计数,引用计数在文件表项中维护,它是当前打开着的引用该文件或套接字的描述符的个数。socket返回后与listenfd关联的文件表项的引用计数为1。accept返回后与connfd关联的文件表项的引用计数也为1。然后fork返回后,这两个描述符就在父进程与子进程间共享(也就是被复制),因此与这两个套接字相关联的文件表项各自的访问计数值均为2。这么一来,当父进程关闭connfd时,它只是把相应的引用计数值从2减为1。该套接字真正的清理和资源释放要等到其引用计数值到达0时才发生。这会在稍后子进程也关闭connfd时发生。

    并发服务器中出现的套接口和连接可视化描述如下:

    image

    image

    image

    image

  • 相关阅读:
    ssh REMOTE HOST IDENTIFICATION HAS CHANGED!
    pipenv+sublime text3 配置
    华硕N55SF 折腾记
    vscode 的tab与空格设置
    kbenigne学习3 get-started 2创建实体
    设置数据编码
    jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
    jquery与其他js冲突
    php取整
    IE8 indexOf
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3584546.html
Copyright © 2011-2022 走看看