bobos12@126.com 发表于 2010-5-8 16:55:37

关于文件补丁更新器的设计

大家好,我的目地是设计一个文件补丁更新器
大致流程是这样的:
1.客户端请求连接,并发送用户名和密码
2.服务器验证完密码,若正确,服务端比较 客户端版本号和最新版本号,如有新的版本,则询问客户端是否要下载

我是打算这样设计的,服务端有三个主要的类,一个Server,一个Login_Handle,一个Update_Handle,三个类都是继承ACE_Event_Handler,Server类主要是负责打开端口,并在handle_input()中创建事件 处理类的指针。Login_Handle是用来登录验证的,Update_Handle用来更新客户端

遇到的问题是这样的:
1.第一次handle_input()他会创建Login_Handle对象login_handler,由login_handler处理下一次从客户端传送过来的数据(即密码验证),我想问,密码验证成功后,(接下来应该可以卸载掉这个服务了吧?)那要怎么将接下来从客户端传送过来的数据转给其他的事件处理器处理?(是重新registe一个句柄进去吗?)
2.如果我把login_handler卸载掉了,并注册了其他的事件处理器,假设我的服务器是支持多个人登录,那以后别人登录后,发送的信息是否还是由login_handler处理?
我用的是ACE_WFMO_Reactor

winston 发表于 2010-5-8 18:38:50

没明白你的设计啊。能贴些代码吗?
一般一个用户和服务器,保持一个链接就可以了。所有的数据交互,使用这个链接通道就能达到。
所以你的用户一旦连接上了,就一直使用这个链接就可以,而且这个链接对象是独立的,和其他用户无关,不干扰。

bobos12@126.com 发表于 2010-5-8 19:18:03

回复 #2 winston 的帖子

代码还没开始写,现在只是在设计 我的意思是设计一个服务器,首先客户端输入密码来登录服务器,然后服务器提供版本下载,
如果想要用ACE_Event_Handler来实现的话,要怎么设计比较合理呢?

winston 发表于 2010-5-8 21:20:24

你得自己设计个简单的协议。
处理登录和后面的交互。
我觉得你应该先看一下ACE的书,不然肯定做不下去。

bobos12@126.com 发表于 2010-5-9 09:40:16

回复 #4 winston 的帖子


int Server::open(const ACE_INET_Addr &local_addr)
{
        if(-1==acceptor_.open(local_addr))
                return 0;
        return reactor()->register_handler(this,ACE_Event_Handler::ACCEPT_MASK);
}

int Server::handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)
{
        /*
        首先接受客户发来的用户名和密码,(使用recv_n接受消息)
        进行密码检查,如果错误则关闭连接,如果正确,则比较版本号,
        是否提示客户端进行下载。如果需要更新,这创建Update_Handle,
        并调用其open函数。

        */
}

int Server::handle_close(ACE_HANDLE handle/* = ACE_INVALID_HANDLE */, ACE_Reactor_Mask close_mask/* =0 */)
{

}

这里我遇到的问题是,我当前还未注册READ_MASK,而在int Server::handle_input(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)调用recv_n能否顺利接收到客户传来的密码信息?

[ 本帖最后由 bobos12@126.com 于 2010-5-9 09:44 编辑 ]

bobos12@126.com 发表于 2010-5-9 12:47:32

我自己写了个调试,是可以接受的,谢谢版主咯!
页: [1]
查看完整版本: 关于文件补丁更新器的设计