2011-07-28 85 views
1

我正在使用boost::asio編寫TCP客戶端。我想發送一個浮點數組的二進制表示。 boost是否提供了一種很好的方式將數據轉換爲二進制表示,以將它放置在boost :: array或其他東西中?如何使用boost :: asio發送原始二進制數據

我以前用過Qt QDataStream,它運行良好;我相信增強有相同的東西嗎?

回答

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的數據,就像你可以寫任何類型的數據到一個文件:

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)); 

鑄造任何該標準明確允許變量爲char*,可能正是因爲您必須能夠將二進制數據序列化到文件和套接字等。

+0

感謝您的答覆。我理解轉換爲char *,但很高興看到正確的C++方式來執行此操作。我將如何擴展到一個數組?它會是一個迭代過程,將每個float轉換爲char *,並將這4個字節(或其他)附加到消息緩衝區中?我知道這似乎是一個基本問題,但我只是想確保我以正確的方式進行。 – Gareth

+0

如果它是一個裸C數組,你應該將'&x [0]'轉換爲'char *'並且將sizeof(T)乘以數組長度,因爲C數組連續存儲在內存中。 –