Chinaunix首页 | 论坛 | 博客
  • 博客访问: 283969
  • 博文数量: 41
  • 博客积分: 2015
  • 博客等级: 大尉
  • 技术积分: 493
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 11:06
文章分类

全部博文(41)

文章存档

2011年(1)

2009年(40)

我的朋友

分类: C/C++

2009-02-28 09:29:38

我稍稍整理了下,就是加了点注释,很基本的东西,大家可以参考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;
}

阅读(17339) | 评论(11) | 转发(0) |
给主人留下些什么吧!~~

疯狂善良2009-12-21 17:38:28

async_read_some的buffer的大小设置跟接不接到数据没有关系吧,除非把要接受的大小>能接受的buffer的大小

kytexzy2009-09-25 18:36:43

很有帮助

chinaunix网友2009-08-21 12:11:51

你好,我传输数据的时候发送端用的是async_write 接受端用的是async_read_some,可是接受端有时能接受到数据有时不能,是不是async_read_some的buffer的大小设置有什么要求,望指教

chinaunix网友2009-07-07 17:34:03

你好!我运行了你的程序,挺好,谢谢分享!但是有个问题,我想让它即时通讯,类似qq,怎么做呢?我在handle_write里边让它读取用户输入,如果不为空就发给客户端,客户端也类似。但是实际的运行效果是,读数据和输入数据交叉运行,比如,我收到很多数据,但只显示一条,除非我现在发送一条数据,才继续显示收到的下一条数据。 不知道boost里边有没有基于消息驱动的函数,就不要用个死循环等待数据了。

疯狂善良2009-05-28 08:47:47

我的QQ:421496142,因为我在公司不能上QQ,回家老婆又要用电脑,所以开QQ的时间比较少,大家可以在我的blog上留言,谢谢。其实我也是一个boost新手,大家共同进步,最近比较忙,写游戏逻辑,通信方面研究也就停止了,大家有哪些新信息,希望告诉我阿