boost::asio 的daytime客户端和服务器实例

本文介绍如何使用 Boost.ASIO 库在 C++ 中实现一个简单的聊天室应用,包括服务器端和客户端的设计与实现。通过该示例,读者可以了解 Boost.ASIO 的基本用法,如异步接受连接、发送和接收消息等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 服务器端

server.h

#include <boost/asio.hpp>
#include <boost/array.hpp>
using boost::asio::ip::tcp;
using namespace boost::asio;

#include <memory>
#include <utility>
#include <vector>
#include <ctime>
#include <iostream>


// A reference-counted non-modifiable buffer class.
//buffer类,用来保存要发送的消息。
class shared_const_buffer
{
public:
    // Construct from a std::string.
    explicit shared_const_buffer(const std::string& data)
        : data_(new std::vector<char>(data.begin(), data.end())),
        buffer_(boost::asio::buffer(*data_))
    {
    }

    // Implement the ConstBufferSequence requirements.
    typedef boost::asio::const_buffer value_type;
    typedef const boost::asio::const_buffer* const_iterator;
    const boost::asio::const_buffer* begin() const { return &buffer_; }
    const boost::asio::const_buffer* end() const { return &buffer_ + 1; }

private:
    std::shared_ptr<std::vector<char> > data_;
    boost::asio::const_buffer buffer_;
};



//处理socket
class Session:public std::enable_shared_from_this<Session>
{
public:
    Session(tcp::socket socket) :
        m_socket(std::move(socket)){}

    void start(){
        std::cout << "connect" << std::endl;
        do_write();  //框架内部,可修改问其他服务器的功能。
    }

private:
    void do_write(){
        std::time_t now = std::time(0);
        shared_const_buffer buffer(std::ctime(&now));

        auto self(shared_from_this());
        boost::asio::async_write(m_socket, buffer,
            [this, self](boost::system::error_code /*ec*/, std::size_t /*length*/)
        {
        });
    }

private:
    tcp::socket m_socket;

};


//服务器主程序,循环异步分发socket事件。
class Server
{
public:
    Server(io_service &ios, short port) :
        m_acceptor(ios, tcp::endpoint(tcp::v4(), port)),
        m_socket(ios)
    {
        do_accept();
    }

private:
    void do_accept(){
        m_acceptor.async_accept(m_socket,
            [this](boost::system::error_code ec){
            if (!ec){
                std::make_shared<Session>(std::move(m_socket))->start();
            }
            do_accept();  //循环
        });
    }

private:
    tcp::socket m_socket;
    tcp::acceptor m_acceptor;
};

main.cpp

#include <boost/asio.hpp>
using namespace boost::asio;

#include "server.h"

int main()
{
    io_service ios;

    int port = 6677;
    Server server(ios, port);

    ios.run();

    return 0;
}

2. 客户端

main.cpp

//stl
#include <iostream>


//boost
#include <boost/asio.hpp>
#include <boost/array.hpp>


int main(int argc, char **argv)
{
    boost::asio::io_service ios;
    boost::asio::ip::tcp::socket socket(ios);

    //连接
    boost::asio::ip::tcp::resolver resolver(ios);
    auto endpoint_iterator = resolver.resolve({ "127.0.0.1", "6677" });
    boost::asio::connect(socket, endpoint_iterator);

    for (;;){
        boost::array<char, 128> 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(), len);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值