Hi all:

Using MS Visual Studio 2008 C++ for Windows 32 (XP brand), I try to construct a POP3 client managed from a modeless dialog box.

As a first step, in the  WM_INITDIALOG message in the dialog-box-procedure, I create a persistent object -say pop3- with all that Boost.asio stuff to do asynchronous connections.  Some like:

     case WM_INITDIALOG:
          return (iniPop3Dlg (hDlg, lParam));

Here we assume that iniPop3Dlg() create the pop3 heap object -say pointed out by pop3p-, and then, connect with the remote server and  initiate a session with the client’s id and password (USER and PASS commands). After that, the server is in TRANSACTION state.

Then, in response to some user input, the  dialog-box-procedure, call the appropriate function. Say:

     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;


Note that total() uses the POP3’s STAT command to get how many emails in the server, while detail() uses two commands consecutively; first STAT to get the total and then a loop with the GET command to retrieve the content of each message.

As an aside: detail() and total() share the same subroutines -the STAT handle routine-, and when finished, both leaves the session as-is.  That is,  without closing the connection; the socket remains opened an the server in TRANSACTION state.

When any option is selected by the first time, the things run as expected, obtaining the desired results. But when making the second chance, the connection hangs.

A closer inspection show that the in the second chance, the first  time that is use the statement

     socket_.get_io_service().run();

It never return.

Note that  all asynchronous wirte an read routines uses the same io_service, and the 

     socket_.get_io_service().reset();

sentence prior to any io_service.run()

Note also that all R/W operations also uses the same timer, who is reseted to cero wait afther each operation is completed:

     dTimer_.expires_from_now (boost::posix_time::seconds(0));

I suspect that the problem is in the io_service or in the timer, and the fact that  subsequent executions occurs in a different load of the routine.

As a  first approach to mi problem, I hope that someone  would bring some light in it, prior to a more detailed exposition of the -very few and simple- Asio routines involved.