C++ 클래스 객체를 stream으로 통신 및 전달방법 - Boost Serialization(2) [Class를 TCP 소켓 통신으로 전송]

공대생의 팁 2019.03.08 00:09
 이전에 Java를 사용하여 Object(객체)를 소켓 통신으로 전송하는 방법에 다루었던 적이 있었습니다. 확실히 Java는 이러한 기능이 구현되어 있어 프로그래밍을 하는 데 있어 상당히 훌륭한 기능을 수행합니다.

안드로이드 - Java 서버간 Object 객체 소켓 프로그래밍
https://elecs.tistory.com/147


 그러나 C++의 경우 아직까지 Java처럼 객체를 전송함에 있어 불편한 점이 있습니다. C를 사용할 경우 전송하기 위해 사용되는 Struct의 크기를 직접 확인하여야 하며 대용량 파일의 경우 한정된 버퍼의 크기에 맞추어 분리하여 전송하여야 하기 때문에 고려해야할 점이 상당히 많습니다.

 C++ 라이브러리 중 하나인 Boost에서는 향상된 소켓 프로그래밍인 ASIO와 Class를 직렬화 할 수 있는 Serialization을 제공합니다. 이름에서 볼 수 있듯이 Serialization를 사용하여 C++의 클래스를 직렬화 하여 Byte 형태로 변환할 수 있기 때문에 이를 다른 컴퓨터에 전송한 후 이를 역직렬화(De-serialization)하여 전송 받은 컴퓨터에서도 똑같은 Class 변수를 생성할 수 있게 되는 것입니다. 자세한 이야기는 아래의 링크를 참조해주시기 바랍니다.

C++ 클래스 객체를 stream으로 통신 및 전달방법 - Boost Serialization(1) [직렬화된 클래스 만들기]
https://elecs.tistory.com/289



 또한 이번 포스팅에서는 TCP 비동기 통신을 사용하여 class 객체값을 전달받는 과정이 구현되어 있습니다. 이와 관련된 정보에 대해 자세히 알고자 하시는 분들께 아래 링크를 참조해주시길 바랍니다.

C++에서 Boost ASIO를 사용하여 TCP 비동기(Unblocked) 통신 프로그래밍
https://elecs.tistory.com/314


 이번 프로그램의 경우 소스코드의 양이 크기 때문에 일부분을 설명하는 방식으로 진행하겠습니다. 먼저 아래에 자신의 환경에 맞는 소스코드를 다운로드 받습니다.

Ubuntu 18.04 버전 이전(Boost 1.65 버전 이전)

asio_serialization_1804.zip


Ubuntu 18.10 버전 이후(Boost 1.66 버전 이후)

asio_serialization_2004.zip


 위 소스코드의 알고리즘은 다음과 같이 구성되어 있습니다.



 서버측에서 stock라는 struct 타입의 object를 가지고 있으며 이를 Serialization하여 Binary 파일로 변환한 후 Server는 Client의 접속을 accept할 준비를 합니다. 서버에서 이와 같은 과정이 완료되면 client에서 connect를 요청합니다.

 client로부터의 connect 요청을 받은 server는 write를 하여 client에게 직렬화 된 object를 수신받습니다. 이후 handler에 등록된 handle_read 함수가 실행되어 수신된 Binary 파일을 역직렬화 한 후 이를 server에서 사용하던 대로의 파일 형식으로 되돌려놓는 방식입니다.



위 소스코드를 다운로드 받으신 후 해당 폴더에서 다음과 같은 명령어를 입력합니다.


$ mkdir build

$ cd build

$ cmake ..

$ make


 위와 같이 실행하셨을 경우 server와 client라는 이름의 실행 파일이 생성됩니다. 해당 파일들은 각각 다음과 같은 명령어로 실행하실 수 있습니다.

$ ./server 포트번호
$ ./client 서버IP 포트번호

 이와 같이 실행하면 client 화면에서 다음과 같은 결과를 확인하실 수 있습니다.