본문 바로가기
프로그래밍/STL

BYTE (unsigned char) Stream / asio send buffer

by neive 2011. 11. 1.
728x90



데이터를 주고 받을 때 암호화/복호화에 용의한 BYTE 형의 Stream 제어 클레스를 만들어 보았습니다

std::copy() 가 주석이고 stdext::unchecked_copy() 를 쓰는 것을 볼 수 있는데 copy() 로 쓰면 위험성이 있습니다
그래서 권장이 unchecked_copy() 인데 stdext:: 로 된 것을 잘 보세요! 아마도 vs2008 부터 지원할수도 있습니다
이전 버전에서는 그냥 copy 로 쓰시면 됩니다

사실은 보내는 부분 보다는 받는 부분이 더 걸작인데 ㅎㅎ



class 예제
class CByteStream  
{
	BYTE*   m_pData;
	int     m_nSize;

public:

	BYTE* GetData() { return m_pData; }
	int size() { return m_nSize; }

	template<class T> void AddValue(T t)
	{
		int nLoc = m_nSize;

		int newSize = 0;
		if(m_pData == NULL)
		{  
			newSize = sizeof(T);
			m_pData = new BYTE[newSize];
			std::cout << "Send Data ";
		}
		else
		{
			newSize = m_nSize + sizeof(T);
			std::auto_ptr Temp(new BYTE[newSize]);
//			std::copy(m_pData, m_pData+nLoc, Temp.get());
			stdext::unchecked_copy(m_pData, m_pData+nLoc, Temp.get());
			delete m_pData;
			m_pData = NULL;
			m_pData = new BYTE[newSize];
//			std::copy(Temp.get(), Temp.get()+newSize, m_pData);
			stdext::unchecked_copy(Temp.get(), Temp.get()+newSize, m_pData);
		}

		*(T*)(m_pData + nLoc) = (t);  
		std::cout << t << ", ";

		m_nSize = newSize;  
	}  

	void AddString(std::string s)  
	{  
		AddValue(s.size());  

		int nLoc = m_nSize;  

		int newSize = m_nSize + s.size();  
		std::auto_ptr Temp(new BYTE[newSize]);  
//		std::copy(m_pData, m_pData+nLoc, Temp.get());
		stdext::unchecked_copy(m_pData, m_pData+nLoc, Temp.get());
		delete m_pData;  
		m_pData = NULL;  
		m_pData = new BYTE[newSize];  
//		std::copy(Temp.get(), Temp.get()+newSize, m_pData);
		stdext::unchecked_copy(Temp.get(), Temp.get()+newSize, m_pData);

//		std::copy(s.begin(), s.end(), m_pData + nLoc);
		stdext::unchecked_copy(s.begin(), s.end(), m_pData + nLoc);
		std::cout << s.c_str() << ", ";

		m_nSize = newSize;  
	}

	CByteStream()  
	{  
		m_pData = NULL;  
		m_nSize = 0;  
	}  
};


실 사용 예제.
이대로 해서 스마트 포인터에 넣어 전송해버리고 자동삭제-

void Send()
{
	CByteStream Msg; 
	Msg.AddValue(1234); 
	Msg.AddValue(3.14f); 
	Msg.AddValue(true); 
	Msg.AddString("나는 꼼수다"); 
	Msg.AddString("Test : iPhone4"); 
	std::cout << std::endl;

	std::auto_ptr ptr(Msg.GetData()); 
	boost::asio::mutable_buffer buf = boost::asio::buffer(ptr.get(), _BUFF_SIZE);
	boost::system::error_code error; 
	int len = boost::asio::write(m_Socket, boost::asio::buffer(buf, Msg.size()), error);
}

728x90

'프로그래밍 > STL' 카테고리의 다른 글

STL map / multimap  (0) 2011.11.03
STL vector, list, map 반복자 도중 삭제  (0) 2011.11.02

댓글