![](/img/trans.png)
[英]Sending and receiving protobuf data over Socket via boost asio
[英]Receiving the wrong data with boost::asio socket
我正在嘗試將boost :: asio用於新的業余愛好項目,但是我無法讓服務器讀取正確的數據。 發送它工作正常,我已經檢查了wireshark並發送了字節[0 0 0 4]后跟[5 0 0 0]。 但是在服務器端,我收到[16 -19 105 0],這讓我很困惑。
這是我發送的方式,通過Wireshark進行查看時效果很好:
boost::asio::io_service io;
tcp::resolver resolver(io);
tcp::resolver::query query("localhost", boost::lexical_cast<string>("40001"));
tcp::resolver::iterator endpoints = resolver.resolve(query);
tcp::socket socket(io);
boost::asio::connect(socket, endpoints);
header h(5);
header::storage data = h.store();
boost::asio::write(socket, boost::asio::buffer(&data[0], header::header_size()));
這是我的服務器類的精簡版本。 使用正確的字節數調用handle_read_header,但是headerbuffer包含怪異值[16 -19 105 0]。
class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
tcp_connection(boost::asio::io_service& io)
: _socket(io)
{
memset(&headerbuffer[0], 0, headerbuffer.size());
}
void start() {
_socket.async_read_some(boost::asio::buffer(&headerbuffer[0], header::header_size()), boost::bind(&tcp_connection::handle_read_header, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_read_header(const boost::system::error_code& error, std::size_t numBytes) {
if(!error) {
BOOST_LOG_SEV(logger, loglvl::debug) <<"handle_read_header, " <<numBytes <<"/" <<header::header_size() <<" bytes";
if (numBytes == header::header_size()) {
std::stringstream ss;
for(u32 a = 0; a < numBytes; ++a) {
ss <<(int)headerbuffer[a] <<" ";
}
BOOST_LOG_SEV(logger, loglvl::debug) <<"header data: " <<ss.str();
mCurrentHeader.load(headerbuffer);
mRemaining = mCurrentHeader.size();
BOOST_LOG_SEV(logger, loglvl::debug) <<"got header with size " <<mCurrentHeader.size();
}
} else {
BOOST_LOG_SEV(logger, loglvl::debug) <<"error " <<error;
}
}
private:
header mCurrentHeader;
std::array<char, 128> headerbuffer;
boost::asio::ip::tcp::socket _socket;
};
(幾乎)完整的代碼可以在http://paste2.org/U97HHaH3中找到
原來是偷偷摸摸的,但同時又很明顯是錯誤。 tcp_connection :: ptr是shared_ptr。 在tcp_server.h中,我在其上調用了start(),但隨后沒有任何引用,這使得shared_ptr合理地假設可以刪除它。 因此該函數正在運行,但是成員變量已被清除。
不知道為什么它有時會起作用,但是我認為那是行為不確定的領域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.