Boost::Array 中的垃圾值与 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;
现在当我从客户端写一行 "hello how are you" 时,它只是打印 "hello" 然后是垃圾值
这是服务器显示的输出:
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���
如何删除这些垃圾值并从客户端
获得完整的 message/line
operator >>
像 scanf()
一样使用空格作为分隔符。你应该使用 std::getline()
.
std::getline(std::cin, line);
为什么要用cout.write()
?只需使用 operator <<
.
std::cout << buf.data();
当然,你应该关心'[=17=]'
-终止。可能 boost.asio 将接收到的字节大小提供给您的处理程序。
>>
just reads up to the first delimiter,在你的情况下是 space。
你的另一个问题是你没有告诉你的接收者你的消息将持续多长时间。
你遇到了三个问题:
首先,无论您实际读取了多少数据,您都从缓冲区写入 1024
个字节。
其次,TCP 连接是streaming,这意味着没有消息边界,这导致单个接收调用可能会收到少于发送的消息,并且您需要多次接收才能接收完整的消息。
第三,其他人回答,输入运算符没有按您预期的那样工作。
客户是这样写
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;
现在当我从客户端写一行 "hello how are you" 时,它只是打印 "hello" 然后是垃圾值
这是服务器显示的输出:
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()
?只需使用operator <<
.std::cout << buf.data();
当然,你应该关心
'[=17=]'
-终止。可能 boost.asio 将接收到的字节大小提供给您的处理程序。
>>
just reads up to the first delimiter,在你的情况下是 space。
你的另一个问题是你没有告诉你的接收者你的消息将持续多长时间。
你遇到了三个问题:
首先,无论您实际读取了多少数据,您都从缓冲区写入 1024
个字节。
其次,TCP 连接是streaming,这意味着没有消息边界,这导致单个接收调用可能会收到少于发送的消息,并且您需要多次接收才能接收完整的消息。
第三,其他人回答,输入运算符没有按您预期的那样工作。