为什么boost::asio::ip::tcp::iostream解析输入?

Why boost::asio::ip::tcp::iostream parses input?

本文关键字:输入 iostream tcp boost asio ip 为什么      更新时间:2023-10-16

我尝试使用iostream类从boost ASIO读取二进制数据从TCP套接字。我使用标准提取操作符(operator>>)从流中读取数据。我使用的环境是Visual Studio 2010。问题是,当我读取流时,似乎流试图将二进制数据解析为字符串。至少这是我在调试代码时所看到的。

是否有一种方法,我可以使用iostream读取它作为二进制流,而不是字符串流?

boost::asio::io_service dataServer;
boost::asio::ip::tcp::endpoint dataServerEndpoint(boost::asio::ip::tcp::v4(), dataServerPort);
boost::asio::ip::tcp::acceptor acceptor(dataServer, dataServerEndpoint);
boost::asio::ip::tcp::iostream dataServerStream;
acceptor.accept(*dataServerStream.rdbuf());
try
{
    vector<char> lineBuffer;
    while (!dataServerStream.eof())
    {
        bool eof = dataServerStream.eof();
        bool bad = dataServerStream.bad();
        bool fail = dataServerStream.fail();
        bool good = dataServerStream.good();
        uint64_t magic;
        dataServerStream >> magic;

因此,它不是从流中获取8个字节并将其移动到"magic"变量中,而是尝试解析流以获得有效的字符串化数字。这当然会失败,并且会设置失败位。

输入运算符>>期望输入为文本,然后将其转换为正确的数据类型。如您所料,这将不能很好地处理二进制数据。

您应该使用read代替:

uint64_t magic;
dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic));

你也犯了一个非常常见的初学者错误,在你循环while (!eof)。这将不起作用,因为直到之后的才设置eof标志,您尝试输入操作。这意味着你将迭代一次到多个。

例如:
uint64_t magic;
while (dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic)))
{
    // Read the rest
}