tcp::acceptor works differently on windows than linux.

I'm writting a multiplatform app which uses a tcp::acceptor. Thread one does: { std::cout<<"Oh but I interupted: "<<std::endl; _myTCPAcceptor->close(); std::cout<<"Done interupting "<<std::endl; } std::cout<<"About to join "<<std::endl; _myAcceptorThread->join(); std::cout<<"Join complete"<<std::endl; Thread two does: { boost::system::error_code ec; boost::asio::socket_base::non_blocking_io command(false); _mySocket.io_control(command,ec); boost::system::error_code ec1; std::cout<<"About to accept "<<std::endl; _myTCPAcceptor->accept(_mySocket,ec1); std::cout<<boost::system::system_error(ec1).what()<<std::endl; std::cout<<"done with the accept"<<std::endl; } Output is: Linux Redhat: About to accept Oh but I interupted: Done interupting About to join ... blocks forever Windows XP: About to accept Oh but I interupted: Done interupting About to join A blocking operation was interrupted by a call to WSACancelBlockingCall done with the accept Join complete on windows xp pro the call populates error code with: A blocking operation was interrupted by a call to WSACancelBlockingCall Any solutions other wise I gotta go to pocking the acceptor with another socket connection :(. -- View this message in context: http://www.nabble.com/tcp%3A%3Aacceptor-works-differently-on-windows-than-li... Sent from the Boost - Users mailing list archive at Nabble.com.

According to the reference: http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/reference/ip__tcp/a... acceptor object is not threadsafe. This means you should not access it this way, and if you do, the behaviour is undefined. To cancel acceptor you could use async_accept() and then post close() to the same thread, using io_service.post().
participants (2)
-
Igor R
-
Michael Dehmlow