boost::asio实现时间服务器
客户端向服务器发送消息,服务器返回当前时间。
客户端
/******************************************************************************
* Function: int client
* Description: 向指定的主机发送daytime命令
* Where: 主机设置为本机,asio的封装使得程序简化了不少
* Return:
* Error:
*****************************************************************************/
int client()
{
try {
boost::asio::io_service io_server;
tcp::resolver resolver(io_server);
//query表示要执行的服务,参数为IP地址和命令名称
//query一般的使用形式为resolver::query query("地址","端口")
//tcp::resolver::query query("192.168.56.101", "9000");
tcp::resolver::query query("127.0.0.1", "9000");
//将query解析为端点条目列表
//返回:表示端点条目列表的范围对象,成功调用此函数可确保返回非空范围
tcp::resolver::iterator endpoint_iter = resolver.resolve(query);
tcp::socket socket(io_server);
boost::asio::connect(socket, endpoint_iter);
for (;;) {
std::array<char, 4096> buf;
boost::system::error_code error;
size_t len = socket.read_some(boost::asio::buffer(buf), error);
if (error == boost::asio::error::eof) {
break;
} else if(error) {
throw boost::system::system_error(error);
}
std::cout.write(buf.data(), len);
std::cout << buf[30] << std::endl;
}
} catch(std::exception & e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
服务器
void server()
{
try {
//使用lambda表达式获取当前时间
auto daytime_toString = []()->std::string {
auto now = std::time(nullptr);
return ctime(&now);
};
boost::asio::io_service io_server;
tcp::acceptor accepter(io_server, tcp::endpoint(tcp::v4(), 13));
for (;;) {
tcp::socket socket(io_server);
//等待客户端连接
accepter.accept(socket);
std::string message = daytime_toString();
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
}
} catch(std::exception & error) {
std::cout << error.what() << std::endl;
}
}