c++ - 提升asio跨平台换行困惑

标签 c++ newline boost-asio

我正在使用 boost asio 编写简单的服务器/客户端来传输二进制数据。特别是,我将 async_write 和 async_read 与 ip:tcp::socket 一起使用。没什么特别的,真的。

boost::asio::async_write(*mp_socket, boost::asio::buffer(data_ptr, data_size), 
                         boost::bind(&TcpSocket::m_handleWrite, this,
                                     boost::asio::placeholders::error,
                                     boost::asio::placeholders::bytes_transferred));

boost::asio::async_read(*mp_socket, boost::asio::buffer(mp_buffer, m_buffer_size),
                         boost::bind(&TcpSocket::m_handleRead, this,
                                     boost::asio::placeholders::error,
                                     boost::asio::placeholders::bytes_transferred));

我随机生成二进制数据并在各种平台对中发送/接收以进行测试。该代码在同一平台(例如所有在 linux 中,所有在 windows 中)都可以正常工作,但无法跨平台工作。

比如左边是windows接收的数据,右边是linux发送的数据。唯一的区别是 Windows 中的 0D0A (CRLF) 和 Linux 中的 0A (LF)。我认为某个地方(在 boost asio 中,或在 winsock 中,等等),LF->CRLF 转换正在发生。

那么,有没有办法在我发送二进制数据时禁用转换?我在 boost::asio 配置中寻找一些选项(例如使用原始缓冲区,而不是流缓冲区),但找不到它。感谢您的帮助。

enter image description here


data_ptr 中的数据

  size_t sz = rand() % 60000;
  char* p = (char*)malloc(sz + 4);
  uint32_t* p_header = reinterpret_cast<uint32_t*>(p);
  *p_header = htonl((uint32_t)sz);
  for (size_t i = 0; i < sz; ++i)
  {
    p[i + 4] = rand() % 255;
  }

最佳答案

我认为问题是因为 async_read 是“面向流的”,参见:Short reads and writes .

我假设 asio 分别使用 CRLFLF 作为 Windows 和 Linux 中的流终止符,我猜它在某个地方使用了Linux 流的 Windows 终止符,反之亦然。

尝试将您的 async_read 调用更改为:

mp_socket->async_read_some(boost::asio::buffer(mp_buffer, m_buffer_size),
                           boost::bind(&TcpSocket::m_handleRead, this,
                                       boost::asio::placeholders::error,
                                       boost::asio::placeholders::bytes_transferred));

我已经使用这种方法读取大型二进制文件并根据它们的哈希值验证了接收到的文件,没有出现您遇到的任何问题。

关于c++ - 提升asio跨平台换行困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22971049/

相关文章:

C++ 位集算法

javascript - 什么是 JavaScript 字符串换行符?

c++:字符串中的每一行(不是文件)

c++ - Boost Asio - 消息内容传输错误

c++ - 处理 async_accept 时不接受?

c++ - 如何检查矩阵中每一行/列的相等性?

C++ this指针,函数调用中的隐藏参数

c++ - 使用不同相机拍摄的图像中的模糊检测

C++ 无法让 cin 从文件重定向中读取结束行字符

c++ - TCP 数据接收超时对我不起作用