diff -Nuar boost_1_49_0-1.53/boost/asio/detail/epoll_reactor.hpp boost_1_49_0/boost/asio/detail/epoll_reactor.hpp --- boost_1_49_0-1.53/boost/asio/detail/epoll_reactor.hpp 2012-05-28 14:16:08.000000000 +0400 +++ boost_1_49_0/boost/asio/detail/epoll_reactor.hpp 2013-02-01 19:16:41.000000000 +0400 @@ -62,6 +62,7 @@ int descriptor_; boost::uint32_t registered_events_; op_queue op_queue_[max_ops]; + bool connected_; bool shutdown_; BOOST_ASIO_DECL descriptor_state(); diff -Nuar boost_1_49_0-1.53/boost/asio/detail/impl/epoll_reactor.ipp boost_1_49_0/boost/asio/detail/impl/epoll_reactor.ipp --- boost_1_49_0-1.53/boost/asio/detail/impl/epoll_reactor.ipp 2012-07-16 10:26:30.000000000 +0400 +++ boost_1_49_0/boost/asio/detail/impl/epoll_reactor.ipp 2013-02-01 19:16:51.000000000 +0400 @@ -155,6 +155,7 @@ descriptor_data->reactor_ = this; descriptor_data->descriptor_ = descriptor; + descriptor_data->connected_ = false; descriptor_data->shutdown_ = false; } @@ -180,6 +181,7 @@ descriptor_data->reactor_ = this; descriptor_data->descriptor_ = descriptor; + descriptor_data->connected_ = false; descriptor_data->shutdown_ = false; descriptor_data->op_queue_[op_type].push(op); } @@ -615,10 +617,13 @@ static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI }; for (int j = max_ops - 1; j >= 0; --j) { - if (events & (flag[j] | EPOLLERR | EPOLLHUP)) + if (events & (flag[j] | EPOLLERR | (connected_ ? EPOLLHUP : 0))) { while (reactor_op* op = op_queue_[j].front()) { + if (j == connect_op) + connected_ = true; + if (op->perform()) { op_queue_[j].pop();