zoukankan      html  css  js  c++  java
  • NotifyMyFrontEnd 函数背后的数据缓冲区(二)

    message level 函数pq_putmessage调用 low level 函数 pq_putbytes,
    pq_putbytes调用 internal_putbytes。

    从internal_putbyes上来看,就可以发现其数据发送的机制:
    有一个小技巧,如果数据缓冲区满了,就发送,否则就先堆在那儿。
    如果原有数据+本次数据量大于数据缓冲去大小那就分多次循环发送。

    internal_putbytes(const char *s, size_t len) 
    {    
       size_t     amount;    
       while (len > 0)    
       {    
          /* If buffer is full, then flush it out */    
          if (PqSendPointer >= PQ_BUFFER_SIZE)    
               if (internal_flush())    
                    return EOF;
    
          amount = PQ_BUFFER_SIZE - PqSendPointer;
          ......
    
       }    
       return 0;    
    } 

    但是,我还有一个疑问:客户端和服务器端可是需要及时响应的呀,不可能一直等缓冲区满才发生 internal_flush吧。

    再研究代码发现,pqcomm.c 中还有 pq_flush函数,它被调用的时候,就会立即调用 internal_flush。

    可以简单总结:
    服务器端完成了客户端的请求后,为向客户端反馈,
    会经过某些函数(如pq_putmessage),走到调用 internal_putbytes的步骤;
    然后返回,接着再调用pq_flush函数(内部调用internal_flush,这将导致向客户端发生网络通信)。

    当调用internal_putbytes时,若信息量已经大于缓冲区大小,则此时也需要调用internal_flush。

  • 相关阅读:
    springboot项目搭建
    linux之scp
    docker文件拷贝
    vue数据绑定不刷新可能情况
    css弹框
    jqgrid跨站脚本漏洞解决
    springboot配置文件加载顺序
    git之在eclipse上玩(一)
    windows系统日志位置
    maven
  • 原文地址:https://www.cnblogs.com/gaojian/p/2595112.html
Copyright © 2011-2022 走看看