Do read musisz podać wskaźnik na bufor oraz rozmiar tego bufora. Ponieważ doskonale wiesz jakich informacji oczekujesz i jakie jest ich ułożenie to tworzysz strukturę opisującą te informacje i podajesz ją do read rzutowaną na ciąg bajtów.
Jest to identyczne co:
...
char buffer[ sizeof( Response ) ] = { 0 };
OTcpSocket socket;
socket.read( buffer, sizeof( buffer ) );
Response* response = reinterpret_cast< Response* >( buffer );
lub:
char buffer[ sizeof( Response ) ] = { 0 };
OTcpSocket socket;
socket.read( buffer, sizeof( buffer ) );
char* ptr = buffer;
// wiemy, że pierwsze pole to id typu int
int response_id_from_buffer = *( reinterpret_cast< int* >( ptr ) );
// przesuwamy wskaźnik na kolejne pole w buforze...
ptr += sizeof( int );
int size_of_response_from_buffer = *( reinterpret_cast< int* >( ptr ) );
// ...i jeszcze raz
ptr += sizeof( int );
char* text_of_response_from_buffer = ptr;