如何使用boost.asio来交换btw客户端和服务器的数据?

时间:2017-07-02 13:00:17

标签: boost boost-asio asio

我实现了两个简单的客户端和服务器示例,但它不起作用。客户端和服务器都冻结,没有打印任何消息。

client.cpp

int main(int argc, char * argv[])
{
std::string raw_ip = "127.0.0.1";
int port = 3333;
try
  {
    asio::ip::tcp::endpoint
      ep(asio::ip::address::from_string(raw_ip), port);
    asio::io_service ios;
    asio::ip::tcp::socket sock(ios, ep.protocol());
    sock.connect(ep);

    asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream << "request from clinet\n";
    asio::streambuf response;
    asio::read_until(sock, response, "\n");
    std::istream response_stream(&response);
    std::cout << response_stream.rdbuf() << std::endl;
  }
  catch(system::system_error &e)
  {
    std::cout << "Encounter error: " << e.what() << std::endl;
    return e.code().value();
  }
}

server.cpp

int main(int argc, char * argv[])
{
  std::string raw_ip="127.0.0.1";
  int port=3333;
  try
  {
    asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(),port);
    asio::io_service ios;
    asio::ip::tcp::acceptor acceptor(ios, ep);
    acceptor.listen();
    asio::ip::tcp::socket sock(ios);
    acceptor.accept(sock);
    asio::streambuf request;
    asio::read_until(sock, request, "\n");
    std::istream request_stream(&request);
    std::cout << request_stream.rdbuf() << std::endl;

    asio::streambuf response;
    std::ostream response_stream(&response);
    response_stream << "response from server\n";
  }
  catch(system::system_error &e)
  {
    std::cout << e.what() << std::endl;
    return -1;
  }
  return 0;
}

另外,我想知道将大量数据传入/从套接字传输的最佳方法,我们如何告诉socket我已经完成了将数据写入套接字?我们怎么知道我们从套接字读取了数据的最后一个字节?感谢。

1 个答案:

答案 0 :(得分:1)

你需要调用阻塞函数&#39; ios.run(){{1}} boost :: io_service`。无论如何,我认为你的应用程序不会产生任何可用的东西。您应该尝试使用其中一个asio示例作为起点。

TCP阻塞回显客户端/服务器示例应该是您想要做的好的起点。

http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_client.cpp

http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_server.cpp

在TCP连接上,您可以使用单个asio缓冲区来确保发送所有数据。但是你应该事先向客户发送一条消息,以便它知道它应该接收多少数据。