더북(TheBook)

이제 수신자 호스트가 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);
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.