• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-07-02)  Socket library |   4 条评论  9 
    文章评分 0 次,平均分 0.0

    该函数原型为:

    void TcpSocket::Buffer(const char *buf, size_t len)

    先列出一些变量的意义
    output_l m_obuf >>这个实际上是个STL容器List,存放的为指向OUTPUT缓冲区的指针。

    typedef std::list<OUTPUT *> output_l;

    OUTPUT *m_obuf_top >>这个是指向output_l的顶部(top)指向的内存区。
    buf >>需要存入top buffer的数据的首地址。
    len >>需要存入top buffer的数据的长度。
    m_output_length >>所有输出缓冲区的总字节数,这些缓冲区由list内的指针指向。
    ptr >>当前已经将buf指向的len字节里的ptr字节写到了TOp buffer(已经处理的字节数)。
    space >>当前缓冲区的空余量。
    pbuf >>为buf中还没写入到Top buffer的首地址。
    sz >>为还没写到top buffer中的字节数。

    //增加数据到输出缓冲区顶部
    
    
    来看源代码:
    void TcpSocket::Buffer(const char *buf, size_t len)
    {
    	//ptr为放入缓冲区中的数据个数
    	size_t ptr = 0;
    	//总共待发送的字节数
    	m_output_length += len;
    	//这里使用while原因
    	//如果当前top元素指针指向的OUTPUT缓冲区不能容纳len个字节,
    	//那么就 需要将当前的top指针指向的OUTPUT填满,剩下的len - ptr个字节则填入到
    	//new出来的新top指针指向的OUTPUT中
    	while (ptr < len)
    	{
    		// buf/len => pbuf/sz
    		size_t space = 0;
    		if ((space = m_obuf_top ? m_obuf_top -> Space() : 0) > 0)
    		{
    			const char *pbuf = buf + ptr;
    			size_t sz = len - ptr;
    			if (space >= sz)
    			{
    				m_obuf_top -> Add(pbuf, sz);
    				ptr += sz;
    			}
    			else
    			{
    				m_obuf_top -> Add(pbuf, space);
    				ptr += space;
    			}
    		}
    		else
    		{
    			m_obuf_top = new OUTPUT;
    			m_obuf.push_back( m_obuf_top );
    		}
    	}
    }
    

    使用while循环的目的是:
    因为当前top buffer的space可能容纳不了len个字节,那么我们就需要先将space个字节放入到当前top buffer,剩下的字节数则需需要重新new一个OUTPUT,相应的top buffer也编程现在new这个缓冲区。

    由代码科技,当space =0是则需要new新的缓冲区。

    		else
    		{
    			m_obuf_top = new OUTPUT;
    			m_obuf.push_back( m_obuf_top );
    		}

    pbuf更新到还没写入到top bufer的首地址,长度也进行更新。

    const char *pbuf = buf + ptr;
    size_t sz = len - ptr;

    如果当前top buffer的space 大于剩余需要写入的字节数,那么就将剩余的sz字节写入。
    如果当前top buffer的space 小于剩余需要写入的字节数,那么就将space填满,剩余的字节再下一个 循环处理。

    			if (space >= sz)
    			{
    				m_obuf_top -> Add(pbuf, sz);
    				ptr += sz;
    			}
    			else
    			{
    				m_obuf_top -> Add(pbuf, space);
    				ptr += space;
    			}
     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/1638.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享