私の目標は、2 つのステップで UDP ソケットからデータを読み取ることです。問題は、最初のステップで読み取られるよりも多くのデータをソケットに書き込む場合です。その結果、残りのデータは消失します。
コードを次のスニペットに減らしました。
#include <boost/asio/ip/udp.hpp>
using namespace boost::asio;
int main() {
io_service net_io;
ip::udp::socket net_sock( net_io, ip::udp::endpoint( ip::udp::v4(), 1234 ) );
uint8_t data[2];
net_sock.receive( buffer( data, 2 ) );
std::cout << data[0] << data[1] << std::endl;
net_sock.receive( buffer( data, 2 ) );
std::cout << data[0] << data[1] << std::endl;
net_sock.close();
return EXIT_SUCCESS;
}
次のようにソケットにデータを書き込むと:
echo '0123456789' | nc -u localhost 1234
プログラムは最初の 2 バイト01
を出力してからブロックします。代わりに、次の出力が期待されました。
01
23
ただし、2 回目のreceive()
呼び出しでブロックされます。マニュアルによると
:
次の条件のいずれかが true になるまで、呼び出しはブロックされます。
∙ 提供されたバッファがいっぱいです。[…]
∙ エラーが発生しました。
バッファが空なのはなぜですか? 立ち上げたら
echo '0123456789' | nc -u localhost 1234
2 回目は、receive()
呼び出しのブロックが解除されますが、同様に出力01
されます。最初に入力した残りのデータはどこ23456789
にあり、その後の
receive()
呼び出しでどのようにアクセスできますか?
背景: 使用例は可変長パケットの読み取りです。つまり、最初にヘッダーを読み取り、次にヘッダーが処理された後 (パケット長に関する情報を含む)、ペイロードの読み取りを続けます。