Boost.Asio 简单的客户端服务器模型不 return 响应
Boost.Asio simple client server model do not return a response
第一次尝试在 boost.asio 上构建我的客户端服务器,服务器对客户端的响应为空。
我不确定是什么问题 - 很乐意提供任何帮助。
服务器代码:
const std::string message = "Hi";
boost::system::error_code ignored_error;
try
{
boost::asio::io_service io_service;
tcp::endpoint endpoint = tcp::endpoint(tcp::v4(), 12345);
tcp::acceptor acceptor(io_service,endpoint);
for (;;){
tcp::socket socket(io_service);
acceptor.accept(socket);
boost::asio::write(socket,boost::asio::buffer(message), ignored_error);
}
}
catch (std::exception& e){
std::cerr << e.what() << std::endl;
}
客户代码:
try{
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(IP, "12345");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
for (;;)
{
std::string 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());
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
socket.read_some
将数据读入由 boost::asio::buffer(buf)
定义的缓冲区。
此缓冲区的大小由 buf.size()
决定。
在你的情况下 std::string
是空的,
所以读取字节的缓冲区是空的。
read_some
读取 0 个字节 和 returns。
因为服务器总是发送由 2 个字节组成的消息,您可以调整大小 buf
以容纳 2 个字节:
std::string buf;
buf.resize(2);
boost::system::error_code error;
size_t len = socket.read_some(boost::asio::buffer(buf), error);
// now read_some reads at most 2 bytes into buf
因为在服务器端创建了一个套接字,它发送消息并被销毁,
您可以使用 dynamic_buffer
+ transfer_all
+ boost::asio::read
读取非固定长度的消息:
std::string buf;
size_t len = boost::asio::read (socket,boost::asio::dynamic_buffer(buf),
boost::asio::transfer_all(),error);
if (len && error == boost::asio::error::eof)
{
// data was read from server and eof is reached
// do sth with buf
}
boost::asio::read
读取数据直到缓冲区被完全读取或发生一些错误(例如 eof
- 服务器端的套接字已关闭)。
服务器发送数据,客户端读取数据,服务器端的套接字被销毁,客户端从asio::read
.
获取eof
第一次尝试在 boost.asio 上构建我的客户端服务器,服务器对客户端的响应为空。 我不确定是什么问题 - 很乐意提供任何帮助。
服务器代码:
const std::string message = "Hi";
boost::system::error_code ignored_error;
try
{
boost::asio::io_service io_service;
tcp::endpoint endpoint = tcp::endpoint(tcp::v4(), 12345);
tcp::acceptor acceptor(io_service,endpoint);
for (;;){
tcp::socket socket(io_service);
acceptor.accept(socket);
boost::asio::write(socket,boost::asio::buffer(message), ignored_error);
}
}
catch (std::exception& e){
std::cerr << e.what() << std::endl;
}
客户代码:
try{
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(IP, "12345");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
for (;;)
{
std::string 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());
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
socket.read_some
将数据读入由 boost::asio::buffer(buf)
定义的缓冲区。
此缓冲区的大小由 buf.size()
决定。
在你的情况下 std::string
是空的,
所以读取字节的缓冲区是空的。
read_some
读取 0 个字节 和 returns。
因为服务器总是发送由 2 个字节组成的消息,您可以调整大小 buf
以容纳 2 个字节:
std::string buf;
buf.resize(2);
boost::system::error_code error;
size_t len = socket.read_some(boost::asio::buffer(buf), error);
// now read_some reads at most 2 bytes into buf
因为在服务器端创建了一个套接字,它发送消息并被销毁,
您可以使用 dynamic_buffer
+ transfer_all
+ boost::asio::read
读取非固定长度的消息:
std::string buf;
size_t len = boost::asio::read (socket,boost::asio::dynamic_buffer(buf),
boost::asio::transfer_all(),error);
if (len && error == boost::asio::error::eof)
{
// data was read from server and eof is reached
// do sth with buf
}
boost::asio::read
读取数据直到缓冲区被完全读取或发生一些错误(例如 eof
- 服务器端的套接字已关闭)。
服务器发送数据,客户端读取数据,服务器端的套接字被销毁,客户端从asio::read
.
eof