Boost::数组中的垃圾值与Boost:Asio一起使用
Garbage value in Boost::Array using with Boost::Asio
客户端正在这样写
std::string line;
std::cin>>line;
boost::asio::write(socket, boost::asio::buffer(line));
服务器正在读取,如下所示
void reader(){
socket_.async_read_some(boost::asio::buffer(buf),
boost::bind(&tcp_connection::handle_read,shared_from_this()));
}
void handle_read()
{
std::cout.write(buf.data(),1024);
std::cout<<"n";
}
tcp::socket socket_;
boost::array<char, 1024> buf;
现在,当我从客户端写一行"你好吗"时,它只是打印"你好",然后垃圾值
以下是服务器显示的输出:
helloA0�B��B�����a�Pa�!0�B�b����uB�`�#K|BP�b��D4B���Bb�Pa���e��e�����pc�!0�Be���xB�`�#KcBe�:7B�����e��e���
如何删除这些垃圾值并从客户端获得完整的消息/行
-
operator >>
与scanf()
一样使用空白作为分隔符。您应该使用std::getline()
。std::getline(std::cin, line);
-
为什么使用
cout.write()
?只需使用CCD_ 5。std::cout << buf.data();
当然,您应该关心
' '
-终止。可能boost.asio会将接收到的字节大小提供给处理程序。
您有三个问题:
首先,不管实际读取了多少数据,都要从缓冲区中写入1024
字节。
其次,TCP连接是流式传输,这意味着没有消息边界,这导致一个接收呼叫可能会比发送的呼叫少,并且您需要多次接收才能接收到完整的消息。
第三,输入操作符并没有像你期望的那样工作。
>>
只读取第一个分隔符,在您的情况下是一个空格。
你的另一个问题是,你没有告诉你的接收者你的消息会有多长。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何将boost::asio::d eadline_timer 与Qt一起使用?
- 将更高的优先级设置为 boost::asio 线程处理进程
- Async_read_until限制读取的字节大小(Boost::asio)
- 程序崩溃使用boost::asio
- boost::asio 无法捕获 SIGINT
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- std::boost::asio::p ost / dispatch 使用哪个io_context?