boost::asio实现同步阻塞时间服务器

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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值