我实现了两个简单的客户端和服务器示例,但它不起作用。客户端和服务器都冻结,没有打印任何消息。
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我已经完成了将数据写入套接字?我们怎么知道我们从套接字读取了数据的最后一个字节?感谢。
答案 0 :(得分:1)
你需要调用阻塞函数&#39; ios.run(){{1}} boost :: io_service`。无论如何,我认为你的应用程序不会产生任何可用的东西。您应该尝试使用其中一个asio示例作为起点。
TCP阻塞回显客户端/服务器示例应该是您想要做的好的起点。
在TCP连接上,您可以使用单个asio缓冲区来确保发送所有数据。但是你应该事先向客户发送一条消息,以便它知道它应该接收多少数据。