关于Winson的C/S传输程序最终版的一些问题
问题1:这种服务端的处理模式是否是一般常用服务端的处理模式。比如说在Acceptor-Connector框架上。问题2: ACE_Server.cpp中大体是用一个ACE_TP_Reactor来响应客户连接。但在Request_Handler.cpp中的构造函数的ACE_Thread_Manager *thr_mgr是主要考虑到对以后扩展有什么用途呢?是不是构造函数中的实现应放在open中进行。
问题3: 这是我学习到的所以我提出了问题1,在Request_Handler::handle_input中接收完整包数据后,打包成消息放入到一任务的消息队列中。这种处理是常用的做法吗。
问题4: Task_Manager.cpp中Task_Manager::svc()中生成一些线程进行对消息的处理。如果在处理过程中需要发送数据给客户端怎么样实现像书上说的用reactor和msg的通知策略直接响应Request_Handler::handle_output函数呢?
问题5: Task_Manager.cpp中Task_Manager::svc()中task_tp.msg_queue()->deactivate()这句话是什么意思,我看书是先使消息队列无效这可以理解,唤醒入出队操作上的等待线程是什么意思。
task_tp.wait()是等待其派生的线程都退出吗?但是如果客户端退出,Request_Handler::handle_input中recv返回后return -1,task_tp派生的线程的如何正当的处理其使其安全退出呢。
我是ACE初学,只讨论这个程序的思想和程序流程(我想知道,嘻嘻)BUG不论。再次谢谢winson分享。 追加一个问题,如果将Request_Handler改为ACE_NULL_SYNCH,程序表现上会有哪些不一样的地方。
不说对putq或是getq的一些处理细节的改变。还有其它方面的吗? 1、这种服务端的处理模式也是常用的服务端的处理模式。这是Reactor的,Proactor更适合服务器使用,性能好得多。
2、不知道怎么回答好,我觉得放在哪里无所谓,没觉得作者有特别用意。
3、非常常用的做法,是ACE推荐的。因为这样避免了数据处理过程,对网络处理过程的干扰和阻塞。他们之间使用队列进行了缓冲,能有效的提升网络操作的性能。
4、直接调用发送程序发,出错后缓存,判定错误类型,再尝试。
5、deactivate()是使得消息队列停止活动,处于停止状态。其它等待它的线程,就会收到这个通知,返回了。
6、task_tp.wait()是管理器,它等待所控制的线程退出。Request_Handler::handle_input出错后,默认会调用handle_close()删除。至于task_tp如果同步,没仔细研究过。内部实现了。
7、如果将Request_Handler改为ACE_NULL_SYNCH,会导致多线程同时操作的时候,发生混乱。这个是同步标志,在多线程同时存取一个资源的时候,一定要注意这个问题。
妈呀,累死我了。你自己仔细看看书,C++网络编程卷1、卷2,和ACE程序员指南,这些问题都不难,就是描述起来比较费劲。
页:
[1]