Boost::asio:只有在出现其他连接后才接收数据

Boost::asio: data get received only after other connection appeared

本文关键字:连接 数据 其他 asio Boost      更新时间:2023-10-16

我试图在我的应用程序中使用代码示例。在连接时,客户端向服务器发送"hello!"服务器接收它并以某种方式回答它(并以"嗨,客户端!"我是服务器!")-但这就是我所拥有的:服务器不接收任何东西,直到我通过telnet连接到它并发送一些东西。之后,它接收(打印)客户端和telnet消息。

客户:

socket.connect(tcp::endpoint(tcp::v4(), 21), error);
if (error)
  throw boost::system::system_error(error);
boost::asio::write(socket, boost::asio::buffer("Hello!n"), boost::asio::transfer_all(), ignored_error);
for (;;)
{
  boost::array<char, 128> buf;
  boost::system::error_code error;
  size_t len = socket.read_some(boost::asio::buffer(buf), error);
  if (error == boost::asio::error::eof)
    break; // Connection closed cleanly by peer.
  else if (error)
    throw boost::system::system_error(error); // Some other error.
  std::cout.write(buf.data(), len);
}
服务器:

for (;;)
{
    tcp::socket socket(io_service);
    acceptor.accept(socket);
    for (;;)
    {
        boost::array<char, 128> buf;
        boost::system::error_code error;
        size_t len = socket.read_some(boost::asio::buffer(buf), error);
        if (buf[len-1] == '/n')
            break; // Connection closed cleanly by peer.
        else if (error)
            throw boost::system::system_error(error); // Some other error.
        std::string a(buf.data());
    }
    std::string message = make_daytime_string();
    boost::system::error_code ignored_error;
    boost::asio::write(socket, boost::asio::buffer("Hi, client! I'm server!"),
    boost::asio::transfer_all(), ignored_error);
}

我怕我忘记了要关闭的东西(比如插座)。但不管怎样,还有想法呢?

size_t len = socket.read_some(boost::asio::buffer(buf), error);
if (buf[len-1] == '/n')

你对tcp::ip::socket::read_some()做了一些不正确的假设。

评论

read_some操作可能无法读取所有请求的数据字节。如果需要确保在阻塞操作之前读取请求的数据量完成。

我建议您按照文档的建议使用read() free函数