더북(TheBook)

NaivelySendRoboCat()에선 RoboCat 객체를 char*로 캐스팅하여 send()로 보낸다. 이때 버퍼 길이는 RoboCat 클래스의 크기만큼 잡아 주는데, 위의 클래스 정의에 따르면 int 필드가 두 개이므로 8바이트가 된다. 수신 함수인 NaivelyReceiveRoboCat()에서도 역시 호출자에게 돌려줄 RoboCat 포인터를 char*로 캐스팅하는데, 이렇게 하면 수신할 구조체의 포인터 위치에 소켓 함수가 직접 데이터를 기록하게 된다. 두 호스트 사이에 TCP 소켓 연결이 된 상태에서 RoboCat 객체의 상태를 전송하는 절차는 다음과 같다.

1. 송신자는 전송할 RoboCat의 포인터를 NaiveSendRoboCat()에 넘겨 호출한다.

2. 수신자는 상태를 갱신받을 RoboCat 객체를 하나 만들어 두거나 찾아 둔다.

3. 수신자는 2단계에서 확보한 포인터로 NaivelyReceiveRoboCat()을 호출한다.

 

수신자는 2단계에서 RoboCat 객체를 찾아두거나 만들어 두어야 하는데 구체적인 방법에 대해선 5장 객체 리플리케이션에서 좀 더 자세히 다룬다. 일단 지금은 이런 일을 해 주는 시스템이 있어서 그것을 사용한다고 치자.

송수신 양측의 하드웨어 플랫폼이 같다면, 전송 절차가 끝나고 난 뒤 송신자의 RoboCat의 상태 데이터가 수신자의 RoboCat에 정확하게 복제될 것이다. 그 과정에서 RoboCat의 메모리 레이아웃 변화를 추적해 보면 표 4-1에 나타난 바와 같다. 이번처럼 간단한 클래스의 경우라면 단순 송수신 방식도 꽤 효율적인 편이다.

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