더북(TheBook)

ReceiveRoboCat() 함수는 임시 버퍼를 할당한 뒤 recv() 함수를 호출하여 소켓에 대기 중이던 내용으로 버퍼를 채운 후, 버퍼의 소유권을 입력 메모리 스트림에 넘긴다. 이제 스트림 사용자는 데이터 원소를 하나씩 쓰여진 순서대로 읽어 들일 수 있다. RoboCat::Read() 멤버 함수가 이런 일을 하는데, 스트림의 Read()를 호출하여 RoboCat의 각 필드를 채워 준다.

Tip

이 방법을 본격적인 게임 개발에 도입할 때 주의할 점은, 스트림용 메모리를 최대 가능한 용량으로 미리 할당해 두어야 한다는 것이다. 패킷이 도착할 때마다 메모리를 할당해선 안 된다. 메모리 할당 작업이 느린 경우도 있기 때문이다. 패킷이 도달하면 이렇게 미리 준비된 스트림의 버퍼에 부어 넣는다. 그런 다음 스트림에서 패킷의 데이터를 모두 읽어 들인 뒤, mHead를 0으로 초기화하여 다음 패킷이 도착할 때 같은 버퍼를 재사용하여 읽어 들이도록 한다.

이 경우 MemoryInputStream이 메모리를 직접 관리하게 하는 기능을 추가하는 것도 좋다. 최대 용량을 매개변수로 받는 생성자를 두어 내부의 mBuffer를 스트림이 직접 할당하게 하고, mBuffer에 액세스할 수 있게 접근자를 두어 사용자가 나중에 사용자가 recv() 함수에 버퍼 포인터를 직접 전달하게 해 준다.

 

이처럼 구현하면 스트림이 제공해야 할 기본적인 기능은 준비된 셈이다. 스트림을 사용해 버퍼를 간편히 만들고, 버퍼를 원본 객체의 각 필드로 채운 다음, 이를 통째로 원격 호스트에 보내면 수신 측은 이를 받아 값을 각각 순서대로 추출해, 대상 객체의 알맞은 필드를 골라 집어넣을 수 있다. 또한, 이 과정에서 대상 객체의 가상 함수 테이블 포인터처럼 그대로 두어야 할 부분은 건드리지 않고도 진행할 수 있다.

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