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_ptrTemp(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_ptrptr(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 |
댓글