在Windows中使用C ++进行Boost Asio异步连接的问题

时间:2011-02-23 23:04:53

标签: windows visual-c++ boost-asio pop3

使用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或计时器中,以及后续执行发生在例程的不同负载中的事实。

作为解决我问题的第一种方法,我希望在更详细地阐述所涉及的极少数和简单例程之前,有人会为此提供一些启示。

1 个答案:

答案 0 :(得分:0)

您是否看过asio examples并研究过它们?有几个异步示例可以帮助您了解基本控制流程。特别重视通过调用io_service::run启动的主事件循环,重要的是理解控制期望返回给调用者,直到io_service没有剩余的工作继续做。