diff --git a/a8/asynctcpclient.cc b/a8/asynctcpclient.cc index e02bd0c..71502ba 100644 --- a/a8/asynctcpclient.cc +++ b/a8/asynctcpclient.cc @@ -125,14 +125,28 @@ namespace a8 void AsyncTcpClient::DoSend() { - if(socket_ == -1){ + if (socket_ == -1) { return; } + if (!work_node_) { + send_buffer_mutex_->lock(); + work_node_ = top_node_; + top_node_ = nullptr; + bot_node_ = nullptr; + send_buffer_mutex_->unlock(); + } if (!connected_) { int error = 0; socklen_t len = sizeof(error); ::getsockopt(socket_, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len); if( !error ) { + if (!work_node_) { + struct epoll_event ev; + ev.data.fd = socket_; + ev.events = EPOLLIN | EPOLLRDHUP; + ev.data.ptr = this; + ::epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, socket_, &ev); + } DoConnect(); } else { connected_ = false; @@ -148,13 +162,6 @@ namespace a8 return; } } - if (!work_node_) { - send_buffer_mutex_->lock(); - work_node_ = top_node_; - top_node_ = nullptr; - bot_node_ = nullptr; - send_buffer_mutex_->unlock(); - } if (work_node_) { AsyncSend(); }