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

标签 c++ boost-asio

我尝试使用 boost ASIO 的 iostream 类从 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 个字节并将其移动到“魔术”变量中,而是尝试解析流以获取有效的字符串化数字。这当然会失败,并且会设置失败位。

最佳答案

输入运算符 >> 期望输入为文本,然后将其转换为正确的数据类型。如您所料,这不适用于二进制数据。

你应该使用 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
}

关于c++ - 为什么 boost::asio::ip::tcp::iostream 解析输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16010809/

相关文章:

c++ - 分段故障运行 boost 示例

c++ - 使用 IO_Service 已经创建的线程效率更高

c++ - 引用类型返回函数和后缀增量

C++:使用自定义分配器时的高效交换()

C++跨平台开发避免预处理器指令

c++ - FFTW 与 Matlab FFT

c++ - 尝试 ping 时提升异常

c++ - 如何使用 boost.asio 解析 ftp 站点?

c++ - 在 Boost.Asio 中同时使用 SSL 套接字和非 SSL 套接字?

c++ - 将 Lua 嵌入 C++