문제

다음과 같은 것처럼 보이는 데이터 구조가 있습니다.

typedef struct
{
  unsigned short m_short1;
  unsigned short m_short2;
  unsigned char m_character;
} MyDataType;

Boost :: Serialization을 사용 하여이 데이터 구조를 직렬화 한 다음 Boost :: ASIO를 사용하여 TCP/IP를 통해 전송 한 다음 다른 응용 프로그램이 데이터를 수신하고 동일한 Boost 라이브러리를 사용하여 해제 할 수 있습니다.

Boost :: Serialization Tutorial을 따르려고합니다, (다른 질문이 제안한 것처럼) 그러나 예제는 특히 부스트 :: asio를 사용하는 소켓이 아닌 파일에 쓰기/읽기를위한 것입니다.

나는 일을위한 올바른 도구를 가지고 있다고 확신합니다. 나는 그들이 함께 일하도록 도와야합니다. 소켓에 글을 쓰는 것은 쓰기와 파일에 그다지 다를 수 없습니다.

모든 제안은 대단히 감사합니다. 감사!

도움이 되었습니까?

해결책

이러한 간단한 구조의 경우, 부스트 :: 직렬화는 과잉과 오버 헤드입니다.

더 간단하게하십시오 :

vector<uint16_t> net(3,0);

net[0]=htons(data.m_short1);
net[1]=htons(data.m_short2);
net[2]=htons(data.character);

asio::async_write(socket,buffer((char*)&net.front(),6),callback);

vector<uint16_t> net(3,0);
asio::async_read(socket,buffer((char*)&net.front(),6),callback);

callback:
data.m_short1=ntohs(net[0]);
data.m_short2=ntohs(net[1]);
data.character=ntohs(net[2]);

그리고 Serialization이

그리고 같은 바이트 순서를 가진 컴퓨터가 작동하는 경우 (큰/작은), 그대로 구조를 보내는 것 - POD.

다른 팁

좋은 직렬화가 있습니다 예시 ASIO 문서에서 : 서버 .cpp, Stock.hpp, 연결 .hpp.

스 니펫은 다음과 같습니다.

std::ostringstream archive_stream;
boost::archive::text_oarchive archive(archive_stream);
archive << your_struct;
outbound_data_ = archive_stream.str();
boost::asio::async_write(socket_, 
    boost::asio::buffer(outbound_data_), handler);

나는 이것을 C ++ 직렬화하려는 사람과 공유 할 것이라고 생각했다. struct 부스트 사용. 위에 주어진 예제에 대해 struct 직렬화 가능합니다 serialize 기능:

typedef struct
{
  unsigned short m_short1;
  unsigned short m_short2;
  unsigned char m_character;

  template <typename Archive>
  void serialize(Archive& ar, const unsigned int version)
  {
    ar & m_short1;
    ar & m_short2;
    ar & m_character;
  }
} MyDataType;

편집 : 아래에 답을 다시받습니다. 제안한 내용은 StringStream 솔루션에 대한 시간과 공간 장점이 있지만 Asio :: Stream API에는 장기적으로 필요한 몇 가지 중요한 기능 (예 : 시간 중단)이 부족합니다.


내 원래 대답 :

boost :: asio의 스트림을 사용하면 std :: stringstreams에 글을 쓰고 한 번에 보내는 시간과 공간 장점이 있습니다. 다음은 다음과 같습니다.

클라이언트 코드 :

boost::asio::ip::tcp::iostream stream("localhost", "3000");

if (!stream)
  throw std::runtime_error("can't connect");

서버 코드 :

boost::asio::io_service ios;
boost::asio::ip::tcp::endpoint endpoint
  = boost::asio::ip::tcp::endpoint(ip::tcp::v4(), 3000);
boost::asio::ip::tcp::acceptor acceptor(ios, endpoint);
boost::asio::ip::tcp::iostream stream;

// Your program stops here until client connects.
acceptor.accept(*stream.rdbuf()); 

그런 다음 클라이언트 또는 서버 스트림과 연결된 후에는 다음과 같습니다.

MyDataType obj;

// Send the object.
boost::archive::text_oarchive archive(stream);
archive << obj;

// Or receive it.
boost::archive::text_iarchive archive(stream);
archive >> obj;

Tymek이 그의 대답에 쓴 것처럼 'Serialize'기능을 MyDatatype에 추가해야합니다.

부스트 :: 아카이브를 위해 직렬화를 수행하여 생성자 매개 변수 - 대상 스트림을 얻습니다. 여기서 데이터를 저장합니다. BOST.IOSTREAMS 라이브러리를 사용하여 네트워크를 통해 데이터를 보내거나 대신 ASIO 소켓 스트림을 사용하는 자체 스트림을 정의 할 수 있습니다.http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/reference/ip__tcp/iostream.html). 좋은 방법입니다. 우리는 이에 대해 비슷한 일을했지만 스트림 (zip/encrypt/send)이 거의없고 모든 작업에 Boost ioStreams 라이브러리를 사용했습니다.

Easy and Dummy Way- 데이터를 임시 파일로 저장 하고이 파일을 보내십시오 :)

부스트 직렬화 아카이브는 모든 스트림으로 구성 할 수 있습니다. 따라서 모든 Oarchive는 모든 타조를 사용할 수 있으며 모든 Iarchive는 모든 istream을 사용할 수 있습니다. 따라서 타조 스트림에 보관하고 ASIO로 문자열을 전송하며 데이터를 재구성 할 수 있습니다.

binary_oarchive의 참조를 참조하십시오 여기, 예를 들어.

먼저 메모리에 아카이브를 보관하고 소켓에 쓰고 싶다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top