Chinaunix首页 | 论坛 | 博客
  • 博客访问: 634978
  • 博文数量: 116
  • 博客积分: 6078
  • 博客等级: 准将
  • 技术积分: 1214
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-23 10:09
文章分类

全部博文(116)

文章存档

2016年(1)

2015年(4)

2011年(2)

2010年(21)

2009年(88)

分类: C/C++

2009-08-27 23:00:02

    最近,自己想开发一套系统,包含的应是非常多的东西,有LINUX和WINDOWS的跨平台服务器,有网站,有PC各操作系统上的客户端,有手机平台上的客户端,还要能支持代理商的功能扩展。
    但是,在做设计时,先说服务器端,想用跨平台c++的网络库然后做成多平台上的服务器,先下了ace,看了看,头非常大。。。。。。。。。。。。。。。。。。。。。。因为使用的c++的特性太多,而我对c++的认识来源于c,顶多了解类的继承和多态等,但对于模板,设计模式等#@#¥¥##**((@*#:。
    接着再看以前用过的wxWidgets的wxSocket系列,不过wxWidgets的东西我认为在效率上太低了,当然做跨平台的UI还是非常不错的,但如果是UI的话,我更建议QT,因为很多嵌入式的UI也会用到miniQT,扯远了。
    然后看到boost::asio的介绍,所以想了解一下,的确,光从网络编程的角度来说是简单了非常多的。但是和传统的:
    SOCKET s;
    Bind(s...);
    Listen(s...);
    Accept(s....);
    select(s.....);
等的差异很大。
    当然boost里的核心还是基于模板的。拿服务器端来说:
    class tcp_connection
    : public boost::enable_shared_from_this
{
public:
    //通过引用计数来管理对象,当计数为0时自动调用destructor
    typedef boost::shared_ptr pointer;

    //why static ? 简单工厂模式,用于创建tcp_connection对象
    static pointer create(boost::asio::io_service& io_service)
    {
        //new 出来的tcp_connection对象的指针都用boost::shared_ptr包装起来
        return pointer(new tcp_connection(io_service));
    }

    ~tcp_connection()
    {
        socket_.close();
        std::cout << "tcp_connection destructor" << std::endl;
    }

    tcp::socket& socket()
    {
        return socket_;
    }

    void start()
    {
        asio::async_read(socket_,
            asio::buffer(static_cast(&FtPkt), sizeof(FileTransferPacket)),
            boost::bind(&tcp_connection::HandleReadFileInfo, shared_from_this(),    //shared_from_this()返回一个boost::shared_ptr,相当于this
            asio::placeholders::error)
            );
    }

    void HandleReadFileInfo(const boost::system::error_code& error)
    {
       
    }

private:
    tcp_connection(asio::io_service& io_service)
        : socket_(io_service)
    {
    }

    void handle_write(const boost::system::error_code& /*error*/,
        size_t /*bytes_transferred*/)
    {
    }

    bool CheckPacketValid()
    {
        return ( FILE_TRANSFER_PROTO_TAG == FtPkt.protoTag );
    }

    void ShowNetWorkError( const boost::system::error_code &error )
    {
        std::cout << error.message() << std::endl;
    }

private:

    std::ofstream fout;
    FileInfo fi;
    tcp::socket socket_;
    FileTransferPacket FtPkt;
};
所看到过的一些例程中,总是会出现类似class tcp_connection
    : public boost::enable_shared_from_this
这样的类声明。
虽然搞清楚了这样使用是因为智能指针可以更安全,但是为什么这样用,还是不明白,任重而道远,boost里的东西对于一个习惯了c的用法开发以及基本类的使用等的用户,简直是天书。但愿有一个好的地方交流和指教。
由于以上的问题的一些困扰,所以自己的服务器架构还是拿不出来。多年来一直只是为了写功能而写程序,从来没考虑过扩展或更深层次的问题,汗。也许想把自己的系统的扩展可以做成象funambol的服务器,只要在服务器配置文件中加一个路径和类名,就可以把自己的扩展功能加到服务器中去,当然这是不现实的,c++中毕竟实现不了类反射。但是客户端的开发可能用c的部分达到最通用的地步。
阅读(1665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~