C++流扩展 streambuff-转载

C++流扩展 streambuff

结合socket流的扩展

#include <WinSock2.h>

/               out
//no buffer
	class SocketOutStreamBuf
		: public std::streambuf
	{
	public:
		SocketOutStreamBuf(SOCKET
			socket) : m_socket(socket) {
		}

	protected:
		int_type overflow(int_type c) {
				if (c != EOF) {
					if (send(m_socket,(char*)&c, 1, 0) <= 0) {
						return EOF;
					}
				}
				return c;
			}

	private:
		SOCKET m_socket;
	};


//has buffer
class SocketOutStreamBuf
	: public std::streambuf
{
public:
	SocketOutStreamBuf(SOCKET
		socket) : m_socket(socket) {
		setp(m_buffer, m_buffer + BufferSize - 1);
	}

	~SocketOutStreamBuf()
	{
		sync();
	}

protected:
	int_type overflow(int_type c) {
			if (c != EOF) {
				*pptr() = c;
				pbump(1);
			}

			if (FlushBuffer() == EOF) {
				return EOF;
			}

			return c;
		}

	int sync()
	{
		if (FlushBuffer() == EOF) {
			return -1;
		}

		return 0;
	}

private:
	int FlushBuffer()
	{

		int len = pptr() - pbase();

		if (send(m_socket, m_buffer, len, 0) <= 0) {
			return EOF;
		}

		pbump(-len);

		return len;
	}

	SOCKET m_socket;
	static const int BufferSize = 512;
	char m_buffer[BufferSize];
};


//use
{
	SOCKET socket;
	…

	SocketOutStreamBuf outBuf(socket);
	std::ostream outStream(&outBuf);

	std::string line;
	while (std::getline(std::cin, line)) {
		outStream << line << std::endl;
	}
}


///  in
//no buffer
	class SocketInStreamBuf
		: public std::streambuf
	{
	public:
		SocketInStreamBuf(SOCKET
			socket) : m_socket(socket) {
		}

		int_type underflow() {
				char c;
				if (recv(m_socket, &c, 1, MSG_PEEK) <= 0) {
					return EOF;
				}

				return c;
			}

		int_type uflow() {
				char c;
				if (recv(m_socket, &c, 1, 0) <= 0) {
					return EOF;
				}

				return c;
			}

	private:
		SOCKET
			m_socket;
	};

	//has buffer
	class SocketInStreamBuf
		: public std::streambuf
	{
	public:
		SocketInStreamBuf(SOCKET
			socket) : m_socket(socket) {
			setg(m_buffer, m_buffer, m_buffer);
		}

		int_type underflow() {
				int recvLen = recv(m_socket, m_buffer, BufferSize, 0);

				if (recvLen <= 0) {
					return EOF;
				}

				setg(m_buffer, m_buffer, m_buffer + recvLen);

				return *gptr();
			}

	private:
		SOCKET m_socket;
		static const int BufferSize = 512;
		char m_buffer[BufferSize];
	};


	//use
	{
		SOCKET socket;

		SocketInStreamBuf inBuf(socket);
		std::istream socketStream(&inBuf);

		std::stringline;
		while (std::getline(socketStream, line)) {
			std::cout << line << std::endl;
		}
	}

转载链接

https://blog.csdn.net/turkeyzhou/article/details/8983379

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值