1

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

客户端.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();
  }
}

服务器.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;
}

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

4

1 回答 1

1

你需要调用阻塞函数'ios.run() in both the client and server to animateboost::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 缓冲区来确保发送所有数据。但是您应该事先向客户端发送一条消息,以便它知道它应该接收多少数据。

于 2017-07-02T20:09:33.277 回答