2011-07-28 7 views
1

boost::asio을 사용하여 TCP 클라이언트를 작성하고 있습니다. 나는 이진 표현으로 수레 배열을 보내고 싶다. 부스트는 boost :: array 같은 배열의 데이터를 바이너리 표현으로 변환하는 좋은 방법을 제공합니까?boost :: asio를 사용하여 원시 이진 데이터를 보내는 방법

저는 과거에 Qt QDataStream을 사용했으며 잘 작동했습니다. 나는 확실히 부스트 뭔가 동등한가?

T x; // anything 
const char * px = reinterpret_cast<const char*>(&x); // no type punning, cast-to-char is allowed 

boost::asio::async_write(my_socket, boost::asio::buffer(px, sizeof(T)), ... 

또는 단순히 파일에 기록 :

std::ofstream f("data.bin"); 
f.write(px, sizeof(T)); 

어떤 주조

답변

2
#include <boost/asio.hpp> 

#include <boost/foreach.hpp> 
#include <boost/lexical_cast.hpp> 

#include <iostream> 

int 
main(unsigned argc, char** argv) 
{ 
    if (argc < 3) { 
     std::cerr << "usage: " << argv[0] << " host port" << std::endl; 
     exit(EXIT_FAILURE); 
    } 

    boost::array<float, 5> foo = {1.0, 2.0, 3.0, 4.0, 5.0}; 
    BOOST_FOREACH(const float i, foo) { 
     std::cout << i << std::endl; 
    } 

    boost::asio::io_service ios; 
    boost::asio::ip::tcp::socket socket(ios); 
    socket.connect(
      boost::asio::ip::tcp::endpoint(
       boost::asio::ip::address::from_string(argv[1]), 
       boost::lexical_cast<unsigned>(argv[2]) 
       ) 
      ); 

    const size_t bytes = boost::asio::write(
      socket, 
      boost::asio::buffer(foo) 
      ); 
    std::cout << "sent " << bytes << " bytes" << std::endl; 
} 
,

bash-3.2$ g++ -I /opt/local/include -L/opt/local/lib -lboost_system -Wl,-rpath,/opt/local/lib array.cc 

실행

bash-3.2$ ./a.out 127.0.0.1 1234 
1 
2 
3 
4 
5 
sent 20 bytes 
bash-3.2$ 

서버에게 응답을

bash-3.2$ nc -l 1234 | hexdump -b 
0000000 000 000 200 077 000 000 000 100 000 000 100 100 000 000 200 100 
0000010 000 000 240 100             
0000014 
bash-3.2$ 
+0

감사합니다. 도움이됩니다. 하나의 질문 - 메시지의 시작 부분에 int를 덧붙이고 싶다고 말하면 (얼마나 많은 수레가 따르는지를 나타 내기 위해). 어떻게 이루어 집니까? – Gareth

1

당신은 당신이 파일에 데이터의 어떤 종류를 쓸 수있는 것처럼, ASIO를 통해 데이터의 종류를 보낼 수 있습니다 변수를 char*으로 지정하면 이진 데이터를 파일 및 소켓 등으로 직렬화 할 수 있어야하기 때문에 표준에 명시 적으로 허용됩니다.

+0

감사를 컴파일합니다. char *로 캐스팅하는 것을 이해합니다. 그러나 적절한 C++ 방법을 사용하는 것이 좋습니다. 배열로 확장하는 방법은 무엇입니까? itterating 과정을 통해 각 float를 char *로 캐스팅하고 4 바이트 (또는 무엇이든)를 메시지 버퍼에 추가 할 수 있습니까? 이것이 기본적인 질문 인 것 같지만, 나는 올바른 방법으로하고 있는지 확인하고 싶었습니다. – Gareth

+0

알몸의 C 배열 인 경우, C 배열이 연속적으로 메모리에 저장되기 때문에'& x [0]'을'char *'으로 캐스팅하고 크기를'sizeof (T)'에 배열 길이만큼 곱한 값을 가져야합니다 . –

관련 문제