📄 serialdatagram.cpp
字号:
////////////////////////////////////////////////////////////////////////// Filename : SerialDatagram.cpp// Written By : reiot@ewestsoft.com// Description : ////////////////////////////////////////////////////////////////////////// include files#include "SerialDatagram.h"#include "Assert.h"#include "PacketFactoryManager.h"#include "SerialDatagramPacket.h"//////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////SerialDatagram::SerialDatagram () throw () : m_Length(0), m_InputOffset(0), m_OutputOffset(0), m_Data(NULL) { __BEGIN_TRY memset( &m_SockAddr , 0 , sizeof(m_SockAddr) ); m_SockAddr.sin_family = AF_INET; __END_CATCH}//////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////SerialDatagram::~SerialDatagram () throw () { __BEGIN_TRY if ( m_Data != NULL ) { SAFE_DELETE_ARRAY(m_Data); m_Data = NULL; } __END_CATCH}//////////////////////////////////////////////////////////////////////// 郴何 滚欺俊 甸绢乐绰 郴侩阑 寇何 滚欺肺 汗荤茄促.//////////////////////////////////////////////////////////////////////void SerialDatagram::read ( char * buf , uint len ) throw ( Error ){ __BEGIN_TRY // boundary check Assert( m_InputOffset + len <= m_Length ); memcpy( buf , &m_Data[m_InputOffset] , len ); m_InputOffset += len; __END_CATCH}//////////////////////////////////////////////////////////////////////// 郴何 滚欺俊 甸绢乐绰 郴侩阑 寇何 胶飘傅栏肺 汗荤茄促.//////////////////////////////////////////////////////////////////////void SerialDatagram::read ( string & str , uint len ) throw ( Error ){ __BEGIN_TRY // boundary check Assert( m_InputOffset + len <= m_Length ); str.reserve(len); str.assign( &m_Data[m_InputOffset] , len ); m_InputOffset += len; __END_CATCH}//////////////////////////////////////////////////////////////////////// // SerialDatagram 按眉俊辑 Packet 按眉甫 掺笼绢辰促.// SerialDatagramSocket 狼 郴何 滚欺狼 农扁父 面盒洒(?) 农促搁,// peer俊辑 焊辰 菩哦捞 肋妨辑 唱棵 啊瓷己篮 利促. // // (漂洒 快府 霸烙俊辑绰 UDP啊 肺拿 罚惑俊辑父 荤侩登扁 锭巩俊// 犬伏篮 歹 利促..)// // *CAUTION*// // 酒贰狼 舅绊府硫篮, (1) 鞍篮 林家俊辑 朝酒柯 2俺狼 辑肺 促弗 菩哦捞// recvfrom()俊辑 阿阿 蝶肺 府畔登绢具 窍哥, (2) 窍唱狼 菩哦篮 茄波锅俊// 佬囚柳促.. 扼绰 啊沥窍俊辑父 狼固啊 乐促.// //////////////////////////////////////////////////////////////////////void SerialDatagram::read ( SerialDatagramPacket * & pPacket ) throw ( ProtocolException , Error ){ __BEGIN_TRY Assert( pPacket == NULL ); PacketID_t packetID; PacketSize_t packetSize; uint serial; // initialize packet header read( (char*)&packetID , szPacketID ); read( (char*)&packetSize , szPacketSize ); read( (char*)&serial, szuint ); cout << "SerialDatagramPacket I D : " << packetID << endl; // 菩哦 酒捞叼啊 捞惑且 版快 if ( packetID >= Packet::PACKET_MAX ) throw InvalidProtocolException("invalid packet id"); // 菩哦 荤捞令啊 捞惑且 版快 if ( packetSize > g_pPacketFactoryManager->getPacketMaxSize(packetID) ) throw InvalidProtocolException("too large packet size"); // 单捞磐弊伐狼 农扁啊 菩哦狼 农扁焊促 累阑 版快 if ( m_Length < szPacketHeader + packetSize ) throw Error("单捞磐弊伐 菩哦捞 茄锅俊 佬囚瘤瘤 臼疽嚼聪促."); // 单捞磐弊伐狼 农扁啊 菩哦狼 农扁焊促 努 版快 if ( m_Length > szPacketHeader + packetSize ) throw Error("咯矾 俺狼 单捞磐弊伐 菩哦捞 茄波锅俊 佬囚脸嚼聪促."); // 菩哦阑 积己茄促. pPacket = (SerialDatagramPacket*)g_pPacketFactoryManager->createPacket( packetID ); Assert( pPacket != NULL ); // 矫府倔阑 持绰促 pPacket->setSerial( serial ); // 菩哦阑 檬扁拳茄促. pPacket->read( *this ); // 菩哦阑 焊辰 林家/器飘甫 历厘茄促. pPacket->setHost( getHost() ); pPacket->setPort( getPort() ); __END_CATCH}//////////////////////////////////////////////////////////////////////// 寇何 滚欺俊 甸绢乐绰 郴侩阑 郴何 滚欺肺 汗荤茄促.//////////////////////////////////////////////////////////////////////void SerialDatagram::write ( const char * buf , uint len ) throw ( Error ){ __BEGIN_TRY // boundary check Assert( m_OutputOffset + len <= m_Length );// if (m_OutputOffset + len > m_Length)// {// throw Error( "SerialDatagram::write(): 静妨绰 郴侩捞 滚欺狼 农扁焊促 女聪促.");// } memcpy( &m_Data[m_OutputOffset] , buf , len ); m_OutputOffset += len; __END_CATCH}//////////////////////////////////////////////////////////////////////// 寇何 胶飘傅俊 甸绢乐绰 郴侩阑 郴何 滚欺肺 汗荤茄促.//// *CAUTION*//// 葛电 write()甸捞 write(const char*,uint)甫 荤侩窍骨肺, m_OutputOffset// 阑 函版秦临 鞘夸绰 绝促.////////////////////////////////////////////////////////////////////////void SerialDatagram::write ( const string & str ) throw ( Error ){ __BEGIN_TRY // boundary check Assert( m_OutputOffset + str.size() <= m_Length ); // write string body write( str.c_str() , str.size() ); __END_CATCH}////////////////////////////////////////////////////////////////////////// write packet//// 菩哦狼 官捞呈府 捞固瘤甫 单捞磐弊伐栏肺 笼绢持绰促.// 菩哦阑 傈价窍绰 率俊辑 捞 皋筋靛甫 龋免窍哥, 捞 惑怕俊辑 单捞磐弊伐狼// 郴何 滚欺绰 NULL 捞绢具 茄促. 溜 捞 皋筋靛甫 龋免且 锭 滚欺啊 且寸// 登绢具 茄促.////////////////////////////////////////////////////////////////////////void SerialDatagram::write ( const SerialDatagramPacket * pPacket ) throw ( ProtocolException , Error ){ __BEGIN_TRY Assert( pPacket != NULL ); PacketID_t packetID = pPacket->getPacketID(); PacketSize_t packetSize = pPacket->getPacketSize(); uint serial = pPacket->getSerial(); // 单捞鸥弊伐狼 滚欺甫 利例茄 农扁肺 汲沥茄促. setData( szPacketHeader + packetSize ); // 菩哦 庆歹甫 汲沥茄促. write( (char*)&packetID , szPacketID ); write( (char*)&packetSize , szPacketSize ); write( (char*)&serial, szuint ); // 菩哦 官叼甫 汲沥茄促. pPacket->write( *this ); __END_CATCH}////////////////////////////////////////////////////////////////////////// set data//// 单捞磐弊伐家南俊辑 佬绢甸牢 单捞磐甫 郴何滚欺俊 汗荤茄促.////////////////////////////////////////////////////////////////////////void SerialDatagram::setData ( char * data , uint len ) throw ( Error ) { __BEGIN_TRY Assert( data != NULL && m_Data == NULL ); m_Length = len; m_Data = new char[m_Length]; memcpy( m_Data , data , m_Length ); __END_CATCH}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void SerialDatagram::setData ( uint len ) throw ( Error ){ __BEGIN_TRY Assert( m_Data == NULL ); m_Length = len; m_Data = new char[ m_Length ]; __END_CATCH} //////////////////////////////////////////////////////////////////////// set address//////////////////////////////////////////////////////////////////////void SerialDatagram::setAddress ( SOCKADDR_IN * pSockAddr ) throw ( Error ) { __BEGIN_TRY Assert( pSockAddr != NULL ); memcpy( &m_SockAddr , pSockAddr , szSOCKADDR_IN ); __END_CATCH}//////////////////////////////////////////////////////////////////////// get debug string//////////////////////////////////////////////////////////////////////string SerialDatagram::toString () const throw (){ StringStream msg; msg << "SerialDatagram(" << "Length:" << m_Length << ",InputOffset:" << m_InputOffset << ",OutputOffset:" << m_OutputOffset << ")"; return msg.toString();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -