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
相关产品推荐
相关产品推荐

