簡體   English   中英

boost read_until 在空白處停止

[英]boost read_until stops at white space

我正在嘗試使用 boost 設置一個 tcp 套接字服務器。 出於某種原因,函數read_until似乎停在空白處,而不是一直走到分隔符。 例如:

發送

┼N▀]»ü rx}q╠Cä≥è┘Y\║ï2æ╨╬ΣfV╠παÇ/S┬0è3à ╫VR∞{εoÆ?LeN≡╬.lÖnÖ1⌡&âm&ù╫ä╛'°≈L▀_ °çF¿P»2ß|╪+96#3kα≥
╟¬─╣╩í▄¢hú╤fûº╢5~AcbF┌Zd╒∞?╓)a.ƒ¿B■αZº=■uΣ╔nÜ┌╬▌╝>┌iE┌y≈ÿ≤┴Kå ²å£∩¢R>╒S(y╙cPjA▀▀Z2O╓?  ÆÉ@τß╢ªy╗▒*Γ▓σ&K₧@╦╩∙⌠%ßΩ-x*Ü╞7ε_█zâ╡C
╧╩║╗Q■═TM╠<æ┤päi^▓'àiUóα<«3Çÿ ─╗E  Σ]ππa╒εk»╣╕(╔╡╙ä╝y≡╥¡╠▌╪┼¡Ö
a|MC├₧\y╚üßσ√⌡ÿ±2<æq}ÿ┌Mzçα∩òΣÆ{end}

收到:

┼N▀]»ü

我從套接字讀取的代碼是

string read_(tcp::socket& socket, CryptoPP::RSA::PrivateKey *privateKey) {
    boost::asio::streambuf buf;
    boost::asio::read_until(socket, buf, "{end}");
    string data = boost::asio::buffer_cast<const char*>(buf.data());
    std::cout << "recived:\n" << data << std::endl;
    return data
}

解決方案:

string read_(tcp::socket& socket, CryptoPP::RSA::PrivateKey *privateKey) {
    boost::asio::streambuf buf;
    boost::asio::read_until(socket, buf, "{end}");
    streambuf::const_buffers_type buf2 = buf.data();
    string data(buffers_begin(buf2), buffers_begin(buf2) + buf.size());
    std::cout << "recived:\n" << data << std::endl;
    return data
}

您應該以安全的方式輸出字符,例如將每個字節打印為 2 個十六進制數字:

auto read_(tcp::socket& socket, CryptoPP::RSA::PrivateKey * /*privateKey*/) {
    std::vector<uint8_t> data;
    boost::asio::read_until(
        socket,
        boost::asio::dynamic_buffer(data),
        "{end}");

    std::cout << "received:\n";
    for (int ch : data) {
        std::cout << " " << std::hex << std::setw(2) << std::setfill('0') << ch;
    }

    return data;
}

請注意,我選擇:

  • 省略中間流streambuf
  • 借此機會證明您可以輕松使用更多 apt 數據結構( std::vector<uint8_t> ),盡管您當然可以將其替換為std::string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM