博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NotifyMyFrontEnd 函数背后的数据缓冲区(二)
阅读量:6073 次
发布时间:2019-06-20

本文共 877 字,大约阅读时间需要 2 分钟。

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。
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/17/2595112.html,如需转载请自行联系原作者
你可能感兴趣的文章
笔记本搜索不到某一AP广播的SSID,信道的原因
查看>>
基于Spring MVC的异常处理及日志管理
查看>>
MediaBrowserService 音乐播放项目《IT蓝豹》
查看>>
MySQL入门12-数据类型
查看>>
Windows Azure 保留已存在的虚拟网络外网IP(云服务)
查看>>
修改字符集
查看>>
HackTheGame 攻略 - 第四关
查看>>
js删除数组元素
查看>>
带空格文件名的处理(find xargs grep ..etc)
查看>>
华为Access、Hybrid和Trunk的区别和设置
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>
关于HTML5的理解
查看>>
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
dom4j解析xml文件
查看>>
第六周
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>