Boost logo

Boost Users :

Subject: Re: [Boost-users] asio - improving chat server example for my
From: john grant (johnkonradgrant_at_[hidden])
Date: 2012-05-21 17:51:29


Marat,

Thanks for your informative response. Your answers helped to confirm my suspicions about Asio and Threads.

As you recall, I am using boost/Threads to execute io_service::run() to allow my server to have a main-thread application loop. The use of threads have complicated my application design by giving me problems to join the thread_group upon shutdown.

I just had the thought, maybe I can tickle the io_service each frame of my main-thread loop instead of using Threads? Is that the motivation for io_service::poll() ? Maybe using io_service.poll() will allow me to avoid the need for threads, at least while I'm proving the concept. What do you think?

Maybe I can contribute a more interesting TCP server example if this works. :) Ideally, it would also show clean shutdown when using threads to run the io_service, but I'm not there yet.

Also, I began looking at your code. Thank you for making it available. I'm a little worried it will take me as long to learn your framework as it will to learn the Asio framework. I will keep trying, as it is likely the only example use of Asio that I know of other than the simple examples on Asio's documentation.

Many thanks,
John

________________________________
 From: Marat Abrarov <abrarov_at_[hidden]>
To: boost-users_at_[hidden]
Sent: Saturday, May 19, 2012 12:43 PM
Subject: Re: [Boost-users] asio - improving chat server example for my
 
Hi, John.

> Many thanks for any help. I'm really enjoying Asio and other parts of Boost, but I still don't
> understand the framework completely.

Sorry, if I'm spamming you but feel free to read Asio examples at my project -
http://sourceforge.net/projects/asio-samples. May be it can help in some architecture decisions.

> 2- This might be way off, but I also wondered if I need to close all the sockets so that the thread group could join.

Yes, you need to close all sockets (and other instances of asio::basic_io_object) having pending asynchronous operations
(read/write for sockets, async_wait for timers, etc), related to the used instance of asio::io_service. Otherwise you
can call asio::io_service::stop().

> I added 2 member functions to help me:
>
> void chat_server::close()
> {
> ? room_.close();
> }
>
> void chat_room::close()
> {
> ? std::for_each( participants_.begin(), participants_.end(), boost::bind(&chat_room::leave, this, _1)
> );
> }
>
> I call this in my server app class's destructor before calling thread_group::join_all, but this has a
> crash. The crash occurs right after chat_room::close() completes. I'm not confident in the way I used
> bind(...), but I was able to see the function execute, and then the crash occurs later.

You need to implement chat_participant::close() like it is done at:
http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/example/chat/chat_client.cpp

Regards,
Marat Abrarov.

_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net