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

时间:2011-09-14 18:40:46

标签: c++ boost boost-asio

我正在尝试在我的应用程序中使用代码示例。在连接客户端发送“你好!”到服务器。服务器收到它并以某种方式回答它(​​并以“嗨,客户端!我是服务器!”结束消息) - 但这就是我所拥有的:服务器在通过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);
}

我害怕忘了要关闭的东西(比如插座)。但无论如何 - 和想法?

1 个答案:

答案 0 :(得分:1)

size_t len = socket.read_some(boost::asio::buffer(buf), error);

if (buf[len-1] == '/n')

您对tcp::ip::socket::read_some() read()做了一些假设。

  

说明

     

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

我建议您使用{{1}} read function作为文档建议。