You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boost Asio async_receive/write收发异常:0x00后接收值为0xFE

解决Boost.Asio二进制数据包收发不完整的问题

咱们先直接定位问题根源:你的客户端发送函数里误用了strcpy_s——这是字符串专属处理函数,它会在遇到0x00(空字符)时立刻停止复制操作。而你的数据包第3个字节正好是0x00,所以strcpy_s只把前3个有效字节(0x55, 0x03, 0x00)复制到了buffer_sender里,后面的12个字节根本没被复制。之后你调用boost::asio::write发送15字节时,实际发出去的是前3个正确数据加上buffer_sender里12个未初始化的脏内存(也就是服务器收到的0xFE)。

修复步骤

把字符串复制函数替换成二进制内存复制函数,因为你发送的是二进制数据包,不是以\0结尾的普通字符串:

void send(const char* text, int length) { 
    if (length > BUFFER_SIZE) return; 
    memcpy(buffer_sender, text, length); // 用memcpy处理二进制数据,不会被0x00截断
    boost::asio::write(*socket_sender, boost::asio::buffer(buffer_sender, length)); 
}

额外优化建议

服务器端当前用的async_receive是异步单次接收,在复杂网络环境下可能无法一次性收到完整的15字节数据。如果你的数据包是固定长度的,建议改用async_read来强制接收指定长度的内容,确保不会出现接收不完整的情况:

boost::asio::async_read(receive_socket, 
    boost::asio::buffer(receive_buffer[1], 15), // 明确指定接收15字节
    boost::bind(&ClientServingLogic::receive_event, this, 1, 
        boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred));

内容的提问来源于stack exchange,提问作者K VARK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:28:26