|
@@ -120,7 +120,6 @@ bool TcpTransport::outgoing(message_ptr message) {
|
|
return true;
|
|
return true;
|
|
|
|
|
|
mSendQueue.push(message);
|
|
mSendQueue.push(message);
|
|
-
|
|
|
|
setPoll(PollService::Direction::Both);
|
|
setPoll(PollService::Direction::Both);
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
@@ -152,48 +151,50 @@ void TcpTransport::connect() {
|
|
try {
|
|
try {
|
|
prepare(ai->ai_addr, socklen_t(ai->ai_addrlen));
|
|
prepare(ai->ai_addr, socklen_t(ai->ai_addrlen));
|
|
|
|
|
|
- auto callback = [this, result, ai, recurse](PollService::Event event) mutable {
|
|
|
|
- try {
|
|
|
|
- if (event == PollService::Event::Error)
|
|
|
|
- throw std::runtime_error("TCP connection failed");
|
|
|
|
-
|
|
|
|
- if (event == PollService::Event::Timeout)
|
|
|
|
- throw std::runtime_error("TCP connection timed out");
|
|
|
|
-
|
|
|
|
- if (event != PollService::Event::Out)
|
|
|
|
- return;
|
|
|
|
|
|
+ } catch (const std::runtime_error &e) {
|
|
|
|
+ PLOG_DEBUG << e.what();
|
|
|
|
+ recurse(ai->ai_next, recurse);
|
|
|
|
+ }
|
|
|
|
|
|
- int err = 0;
|
|
|
|
- socklen_t errlen = sizeof(err);
|
|
|
|
- if (::getsockopt(mSock, SOL_SOCKET, SO_ERROR, (char *)&err, &errlen) != 0)
|
|
|
|
- throw std::runtime_error("Failed to get socket error code");
|
|
|
|
|
|
+ auto callback = [this, result, ai, recurse](PollService::Event event) mutable {
|
|
|
|
+ try {
|
|
|
|
+ if (event == PollService::Event::Error)
|
|
|
|
+ throw std::runtime_error("TCP connection failed");
|
|
|
|
|
|
- if (err != 0) {
|
|
|
|
- std::ostringstream msg;
|
|
|
|
- msg << "TCP connection failed, errno=" << err;
|
|
|
|
- throw std::runtime_error(msg.str());
|
|
|
|
- }
|
|
|
|
|
|
+ if (event == PollService::Event::Timeout)
|
|
|
|
+ throw std::runtime_error("TCP connection timed out");
|
|
|
|
|
|
- PLOG_INFO << "TCP connected";
|
|
|
|
- freeaddrinfo(result);
|
|
|
|
- changeState(State::Connected);
|
|
|
|
|
|
+ if (event != PollService::Event::Out)
|
|
|
|
+ return;
|
|
|
|
|
|
- setPoll(PollService::Direction::In);
|
|
|
|
|
|
+ int err = 0;
|
|
|
|
+ socklen_t errlen = sizeof(err);
|
|
|
|
+ if (::getsockopt(mSock, SOL_SOCKET, SO_ERROR, (char *)&err, &errlen) != 0)
|
|
|
|
+ throw std::runtime_error("Failed to get socket error code");
|
|
|
|
|
|
- } catch (const std::runtime_error &e) {
|
|
|
|
- PLOG_DEBUG << e.what();
|
|
|
|
- recurse(ai->ai_next, recurse);
|
|
|
|
|
|
+ if (err != 0) {
|
|
|
|
+ std::ostringstream msg;
|
|
|
|
+ msg << "TCP connection failed, errno=" << err;
|
|
|
|
+ throw std::runtime_error(msg.str());
|
|
}
|
|
}
|
|
- };
|
|
|
|
|
|
|
|
- const auto timeout = 10s;
|
|
|
|
- PollService::Instance().add(
|
|
|
|
- mSock, {PollService::Direction::Out, timeout, std::move(callback)});
|
|
|
|
|
|
+ PLOG_INFO << "TCP connected";
|
|
|
|
+ freeaddrinfo(result);
|
|
|
|
+ changeState(State::Connected);
|
|
|
|
+ setPoll(PollService::Direction::In);
|
|
|
|
|
|
- } catch (const std::runtime_error &e) {
|
|
|
|
- PLOG_DEBUG << e.what();
|
|
|
|
- recurse(ai->ai_next, recurse);
|
|
|
|
- }
|
|
|
|
|
|
+ } catch (const std::runtime_error &e) {
|
|
|
|
+ PLOG_DEBUG << e.what();
|
|
|
|
+ PollService::Instance().remove(mSock);
|
|
|
|
+ ::closesocket(mSock);
|
|
|
|
+ mSock = INVALID_SOCKET;
|
|
|
|
+ recurse(ai->ai_next, recurse);
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const auto timeout = 10s;
|
|
|
|
+ PollService::Instance().add(mSock,
|
|
|
|
+ {PollService::Direction::Out, timeout, std::move(callback)});
|
|
};
|
|
};
|
|
|
|
|
|
attempt(result, attempt);
|
|
attempt(result, attempt);
|
|
@@ -304,8 +305,6 @@ bool TcpTransport::trySendMessage(message_ptr &message) {
|
|
|
|
|
|
void TcpTransport::process(PollService::Event event) {
|
|
void TcpTransport::process(PollService::Event event) {
|
|
try {
|
|
try {
|
|
- PLOG_VERBOSE << "Poll event";
|
|
|
|
-
|
|
|
|
switch (event) {
|
|
switch (event) {
|
|
case PollService::Event::Error: {
|
|
case PollService::Event::Error: {
|
|
PLOG_WARNING << "TCP connection terminated";
|
|
PLOG_WARNING << "TCP connection terminated";
|