& ssquo; & hellip;
void rawSend( const vector<unsigned char>* data );
std::vector , , . , std::vector. , , , .
& hellip;
vector<unsigned char>* rawRead(unsigned bufferSize = DEFAULT_BUFFER_SIZE, string* hostFrom = NULL);
: std::string, "hostFrom" ( ), vector. , . , , .
. , . I.e., .
& hellip;
void send_message(NLSocket* socket, uint16_t opcode, const void* rawData, size_t rawDataSize)
{
vector<unsigned char> buffer;
buffer.reserve(sizeof(uint16_t) + rawDataSize);
buffer.push_back(opcode >> 8);
buffer.push_back(opcode & 0xFF);
const unsigned char* base(reinterpret_cast<const unsigned char*>(rawData));
buffer.insert(buffer.end(), base, base + rawDataSize);
socket->rawSend(&buffer);
}
:
reserve - . vector ( ) . vector .
buffer.push_back(opcode >> 8) 8 () 16- opcode . , , -, endian. . , endian, endian. , , , , .
buffer.push_back(opcode & 0xFF) 8 opcode , endian.
const unsigned char* base(reinterpret_cast<const unsigned char*>(rawData)) , base. const unsigned char* , . const void* .
buffer.insert(buffer.end(), base, base + rawDataSize) . base + rawDataSize - , .
socket->rawSend(&buffer) SillyLibrary & ss rawSend.
SillyLibrary rawRead.
( , ):
typedef unsigned char Byte;
typedef ptrdiff_t Size;
, // ( ) SillyLibrary:
void deleteSillyLibVector( vector<Byte> const* p )
{
}
, std::vector, . . - , std::vector.
.
, SillyLibrary, , , . . , , , vector:
Size receive_append( NLSocket& socket, vector<Byte>& data )
{
vector<Byte> const* const result = socket.raw_read();
if( result == 0 )
{
return 0;
}
struct ScopeGuard
{
vector<Byte>* pDoomed;
explicit ScopeGuard( vector<Byte>* p ): pDoomed( p ) {}
~ScopeGuard() { deleteSillyLibVector( pDoomed ); }
};
Size const nBytesRead = result->size();
ScopeGuard cleanup( result );
data.insert( data.end(), result->begin(), result->end() );
return nBytesRead;
}
, . - std::bad_alloc, . , , , ( - , SillyLibrary , ).
, , , vector. , , . , .
: .
hth.,