이제 수신자 호스트가 RoboCat을 받으려면 위에서 구현한 출력 스트림에 대응하는 입력 메모리 스트림과 RoboCat::Read() 멤버 함수가 필요하다. 다음 코드 4-2를 보자.
코드 4-2 입력 메모리 스트림
class InputMemoryStream { public: InputMemoryStream(char* inBuffer, uint32_t inByteCount) : mCapacity(inByteCount), mHead(0) { } ~InputMemoryStream() { std::free(mBuffer); } uint32_t GetRemainingDataSize() const { return mCapacity - mHead; } void Read(void* outData, uint32_t inByteCount); void Read(uint32_t& outData) { Read(&outData, sizeof(outData)); } void Read(int32_t& outData) { Read(&outData, sizeof(outData)); } private: char* mBuffer; uint32_t mHead; uint32_t mCapacity; }; void RoboCat::Read(InputMemoryStream& inStream) { inStream.Read(mHealth); inStream.Read(mMeowCount); // TODO: mHomeBase : 아직 처리 불가 inStream.Read(mName, 128); // TODO: mMiceIndices : 아직 처리 불가 } const uint32_t kMaxPacketSize = 1470; void ReceiveRoboCat(int inSocket, RoboCat* outRoboCat) { char* temporaryBuffer = static_cast<char*>(std::malloc(kMaxPacketSize)); size_t receivedByteCount = recv(inSocket, temporaryBuffer, kMaxPacketSize, 0); if (receivedByteCount > 0) { InputMemoryStream stream(temporaryBuffer, static_cast<uint32_t>(receivedByteCount)); outRoboCat->Read(stream); } else std::free(temporaryBuffer); }