TcpSocket类之Buffer(将字节序列压入OUTPUT缓冲区)

2013年7月2日 由 Creater 留言 »

该函数原型为:

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;
			}
广告位

发表评论

你必须 登陆 方可发表评论.