• boost::asio::ip::tcp实现网络通信的小例子


    我稍稍整理了下,就是加了点注释,很基本的东西,大家可以参考socket的几个流程,我上面也有提示的,希望对大家有所帮助。最后,如果大家有什么好的方法希望能让我也分享下,谢谢!

    服务端:

    #include <boost/asio.hpp>
    #include <boost/bind.hpp>
    #include <boost/shared_ptr.hpp>
    #include <boost/enable_shared_from_this.hpp>
    #include <iostream>
    using boost::asio::ip::tcp;
    #define max_len 1024

    class clientSession
        :public boost::enable_shared_from_this<clientSession>
    {
    public:
         clientSession(boost::asio::io_service& ioservice)
            :m_socket(ioservice)
        {
            memset(data_,'\0',sizeof(data_));
        }
        ~clientSession()
        {}
         tcp::socket& socket()
        {
            return m_socket;
        }
        void start()
        {
             boost::asio::async_write(m_socket,
                 boost::asio::buffer("link successed!"),
                 boost::bind(&clientSession::handle_write,shared_from_this(),
                 boost::asio::placeholders::error));

            /*async_read跟客户端一样,还是不能进入handle_read函数,如果你能找到问题所在,请告诉我,谢谢*/

    // --已经解决,boost::asio::async_read(...)读取的字节长度不能大于数据流的长度,否则就会进入

    // ioservice.run()线程等待,read后面的就不执行了。
            
    //boost::asio::async_read(m_socket,boost::asio::buffer(data_,max_len),

            
    //         boost::bind(&clientSession::handle_read,shared_from_this(),

            
    //         boost::asio::placeholders::error));


            
    //max_len可以换成较小的数字,就会发现async_read_some可以连续接收未收完的数据

             m_socket.async_read_some(boost::asio::buffer(data_,max_len),
                     boost::bind(&clientSession::handle_read,shared_from_this(),
                     boost::asio::placeholders::error));
        }
    private:
        void handle_write(const boost::system::error_code& error)
        {
            
            if(error)
            {
                 m_socket.close();
            }
            
        }
        void handle_read(const boost::system::error_code& error)
        {
            
            if(!error)
            {
                std::cout << data_ << std::endl;
                
    //boost::asio::async_read(m_socket,boost::asio::buffer(data_,max_len),

                
    //     boost::bind(&clientSession::handle_read,shared_from_this(),

                
    //     boost::asio::placeholders::error));

                 m_socket.async_read_some(boost::asio::buffer(data_,max_len),
                     boost::bind(&clientSession::handle_read,shared_from_this(),
                     boost::asio::placeholders::error));
            }
            else
            {
                 m_socket.close();
            }
        
        }
    private:
         tcp::socket m_socket;
        char data_[max_len];
    };


    class serverApp
    {
        typedef boost::shared_ptr<clientSession> session_ptr;
    public:
         serverApp(boost::asio::io_service& ioservice,tcp::endpoint& endpoint)
            :m_ioservice(ioservice),
             acceptor_(ioservice,endpoint)
        {
             session_ptr new_session(new clientSession(ioservice));
             acceptor_.async_accept(new_session->socket(),
                 boost::bind(&serverApp::handle_accept,this,boost::asio::placeholders::error,
                 new_session));
        }
        ~serverApp()
        {
        }
    private:
        void handle_accept(const boost::system::error_code& error,session_ptr& session)
        {
            if(!error)
            {
                std::cout << "get a new client!" << std::endl;
                
    //实现对每个客户端的数据处理

                 session->start();
                
    //在这就应该看出为什么要封session类了吧,每一个session就是一个客户端

                 session_ptr new_session(new clientSession(m_ioservice));
                 acceptor_.async_accept(new_session->socket(),
                 boost::bind(&serverApp::handle_accept,this,boost::asio::placeholders::error,
                 new_session));
            }
        }
    private:
         boost::asio::io_service& m_ioservice;
         tcp::acceptor acceptor_;
    };

    int main(int argc , char* argv[])
    {
         boost::asio::io_service myIoService;
        short port = 8100/*argv[1]*/;
        
    //我们用的是inet4

         tcp::endpoint endPoint(tcp::v4(),port);
        
    //终端(可以看作sockaddr_in)完成后,就要accept了

         serverApp sa(myIoService,endPoint);
        
    //数据收发逻辑

         myIoService.run();
        return 0;
    }


  • 相关阅读:
    微服务Kong(三)——添加一个API
    微服务Kong(二)——快速入门
    Oracle 12c 创建用户
    汉字转拼音工具
    GITHUB一个新的项目发布
    Log4J 配置文件模板及代码说明
    Log4J2 配置文件模板及代码说明
    java 写入数据到Excel文件中_Demo
    关于数据库NULL值的几个问题思考
    详解Spring中的Profile
  • 原文地址:https://www.cnblogs.com/lzjsky/p/2017203.html
Copyright © 2020-2023  润新知