Re: [asio-users] A strange issue on Linux, but on Windows works perfectly
Brought to you by:
chris_kohlhoff
From: Dmitry T. <dim...@gm...> - 2011-06-30 13:47:49
|
Hello, again I told about the strange issue, I also told it happens only for async_connect... I've little bit mistaken. The new assertion is: there is no difference how the connection is initiated. It may be client (async_connect) or server (async_accept) the issue occurs anyway. Accept and connect handlers are invoked, but read and write handlers are NOT. This means they are never called from within io_service::poll() I didn't check io_service::run() and etc. I only checked io_service::poll(). I spent a lot of time to make this clear and this is what I found out. I use asio in one of common ways. There is only one thread everything is called from within. io_service::poll() is permanently called, after it finishes the main process() function is called doing all the work to handle incoming data and put outgoing data into the out queue by calling async_read() & async_write() (I tried different variants provided by asio: async_read_some and etc.). The code looks like this in simple way. void main_loop(void) { while (is_working()) { _io_service.poll(); process(); } } void handle_accept() { // first call to async_read() start_read(); } This pefectly works on Windows, but on Linux I get handlers specified to async_read() & async_write() are not actually called even if data (incoming or outgoing) exist (I strictly checked this). There only accept handler is called on server side. io_service is just silent. Acceptor is also works wrong. In my case I only serve one connection, so when the connection is accepted I close the listening socket. When the connection is broken I reopen it. But it's not opened again! It only can be opened if I restart the program. There is a solution: If boost::asio::io_service::work is used everything works as should have been under both Windows and Linux. I create work object before start main_loop() and destroy after main_loop() exits. After I did it, the issue disappeared. asio::acceptor also works properly. If you need test project, or something else, please tell me. Thank you. |