最近,自己想开发一套系统,包含的应是非常多的东西,有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) |