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。







本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/17/2595112.html,如需转载请自行联系原作者
目录
相关文章
|
28天前
|
C语言 C++
文件底层的理解之缓冲区
文件底层的理解之缓冲区
|
3月前
|
存储 JSON 测试技术
高效文件读取策略:Buffer的妙用
高效文件读取策略:Buffer的妙用
47 0
|
3月前
|
机器学习/深度学习 数据采集 自然语言处理
掌握深入挖掘数据本质的方法
掌握深入挖掘数据本质的方法
|
4月前
|
存储 缓存 移动开发
日常小知识点之用户层网络缓冲区(固定内存,ringbuffer,chainbuffer)
日常小知识点之用户层网络缓冲区(固定内存,ringbuffer,chainbuffer)
61 0
|
4月前
|
消息中间件 Kubernetes 网络协议
知识巩固源码落实之3:缓冲区ringbuffer
知识巩固源码落实之3:缓冲区ringbuffer
29 0
|
6月前
|
前端开发 调度 芯片
【芯片前端】根据数据有效选择输出的握手型FIFO结构探究
【芯片前端】根据数据有效选择输出的握手型FIFO结构探究
|
8月前
|
存储 C语言 C++
深度剖析数据在内存中的储存
深度剖析数据在内存中的储存
86 0
|
11月前
|
存储 C语言
内存的读写过程、现实模型及指针
内存的读写过程、现实模型及指针
114 0
内存的读写过程、现实模型及指针
|
11月前
|
5G
带你读《5G 系统技术原理与实现》——3.2.1 5G 帧结构
带你读《5G 系统技术原理与实现》——3.2.1 5G 帧结构