使用MS Visual Studio 2008 C ++ for Windows 32(XP品牌),我尝试构建一个从无模式对话框管理的POP3客户端。
第一步是在对话框程序的WM_INITDIALOG消息中创建一个持久对象-say pop3 - 所有Boost.asio内容都要进行异步连接。有些人喜欢:
case WM_INITDIALOG:
return (iniPop3Dlg (hDlg, lParam));
这里我们假设iniPop3Dlg()创建了由 pop3p 指出的pop3堆对象-say。然后连接远程服务器,并使用客户端的ID和密码(USER和PASS命令)启动会话。这里我们假设服务器处于TRANSACTION状态。
然后,响应一些用户输入,对话框程序,调用相应的函数。说:
case IDS_TOTAL: // get how many emails in the server
total (pop3p);
return FALSE;
case IDS_DETAIL: // get date, sender and subject for each email in the server
detail (pop3p);
return FALSE;
请注意, total()使用POP3的STAT命令获取服务器中的电子邮件数,而 detail()连续使用两个命令;第一个获取总数,然后使用GET命令循环,以检索每条消息的内容。
顺便说一下: detail()和 total()共享相同的子程序 - STAT句柄例程 - 完成后,两者都会按原样保留会话。也就是说,没有关闭连接;套接字保持打开处于TRANSACTION状态的服务器。
当第一次选择任何选项时,事物按预期运行,从而获得所需的结果。但是当第二次出现机会时,连接就会挂起。
仔细检查显示该声明第一次
socket_.get_io_service().run();
使用,永不结束。
请注意,所有异步写入和读取例程都使用相同的io_service,并且每个例程在任何socket_.get_io_service().reset()
之前使用run()
并非所有R / W操作也使用相同的计时器,在每个操作完成后重置为零等待:
dTimer_.expires_from_now (boost::posix_time::seconds(0));
我怀疑问题出现在io_service或计时器中,以及后续执行发生在例程的不同负载中的事实。
作为解决我问题的第一种方法,我希望在更详细地阐述所涉及的极少数和简单例程之前,有人会为此提供一些启示。
答案 0 :(得分:0)
您是否看过asio examples并研究过它们?有几个异步示例可以帮助您了解基本控制流程。特别重视通过调用io_service::run
启动的主事件循环,重要的是理解控制不期望返回给调用者,直到io_service
没有剩余的工作继续做。