Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost读取某些函数丢失的数据_C++_Boost_Tcp_Boost Asio - Fatal编程技术网

C++ boost读取某些函数丢失的数据

C++ boost读取某些函数丢失的数据,c++,boost,tcp,boost-asio,C++,Boost,Tcp,Boost Asio,我正在用boost asio库实现一个tcp服务器。 在服务器中,我使用asio::async\u read\u some获取数据,并使用asio::write写入数据。服务器代码是这样的 std::array<char, kBufferSize> buffer_; std::string ProcessMessage(const std::string& s) { if (s == "msg1") return "resp1"; if (s == "msg2")

我正在用boost asio库实现一个tcp服务器。 在服务器中,我使用asio::async\u read\u some获取数据,并使用asio::write写入数据。服务器代码是这样的

std::array<char, kBufferSize> buffer_;
std::string ProcessMessage(const std::string& s) {
   if (s == "msg1") return "resp1";
   if (s == "msg2") return "resp2";
   return "";
}
void HandleRead(const boost::system::error_code& ec, size_t size) {
  std::string message(buffer_.data(), size);
  std::string resp = ProcessMessage(message);
  if (!resp.empty()) {
    asio::write(socket, boost::asio::buffer(message), WriteCallback);
  }
  socket.async_read_some(boost::asio::buffer(buffer_));
}
看起来read_some函数比从套接字读取的功能要多一点,我将阅读boost代码以确定这是真的。

成员函数很可能没有按照您的意愿执行,请特别注意文档的备注部分

读取操作可能无法读取所有请求的字节数。 如果需要确保该函数,请考虑使用 在异步操作之前读取请求的数据量 完成

请注意,
async\u read()
free函数确实提供了您正在寻找的保证

此操作通过零次或多次调用 流的
async\u read\u some
函数,称为组合函数 活动程序必须确保流不执行其他操作 读取操作(例如
async\u read
,流的
async\u read\u some
函数或执行读取的任何其他组合操作),直到 此操作完成


是吗?@chrisaycock我已经阅读了你提到的问题并更新了这个问题,我认为如果这是一个消息边界问题,要么第一次读一些会得到整个“resp1resp2”,要么第二次读一些会从套接字中得到一些东西,对吗?什么是
asio::read\u some
?我在Asio文档中没有看到这样的免费函数。你能纠正你的问题,使它更准确地反映你在做什么吗?是一个成员函数,而不是。这个问题中的代码没有意义,因为
asio::async\u read\u some()
不会编译。@sam miller,对不起,我的意思是使用socket.async\u read\u some函数,在我提问时出错,我已经更新了问题。
void MessageCallback(const boost::system::error_code& ec, size_t size) {
   std::cout << string(buffer_.data(), size) << std::endl;
}
//Init socket
asio::write(socket, boost::asio::buffer("msg1"));
socket.read_some(boost::asio::buffer(buffer_), MessageCallback);
// Or async_read
//socket.async_read_some(boost::asio::buffer(buffer_), MessageCallback);
asio::write(socket, boost::asio::buffer("msg1"));
socket.read_some(boost::asio::buffer(buffer_), MessageCallback);
// Or async_read
//socket.async_read_some(boost::asio::buffer(buffer_), MessageCallback);
resp
resp