From c2b6d1a74b4942614571c15e5211f3595aa0ce73 Mon Sep 17 00:00:00 2001 From: fantasy-peak <1356346239@qq.com> Date: Thu, 29 Aug 2024 11:07:28 +0800 Subject: [PATCH 1/2] Add setSocketErrorCallback --- trantor/net/TcpClient.cc | 3 +++ trantor/net/TcpClient.h | 11 +++++++++++ trantor/net/callbacks.h | 2 ++ trantor/net/inner/Connector.cc | 14 +++++++++++++- trantor/net/inner/Connector.h | 12 ++++++++++++ trantor/net/inner/Socket.h | 5 +++-- trantor/tests/TcpClientTest.cc | 2 ++ 7 files changed, 46 insertions(+), 3 deletions(-) diff --git a/trantor/net/TcpClient.cc b/trantor/net/TcpClient.cc index 1acd73bb..ae405d8a 100644 --- a/trantor/net/TcpClient.cc +++ b/trantor/net/TcpClient.cc @@ -113,6 +113,9 @@ void TcpClient::connect() ptr->connectionErrorCallback_(); } }); + if (socketErrorCallback_) + connector_->setSockErrorCallback(socketErrorCallback_); + connect_ = true; connector_->start(); } diff --git a/trantor/net/TcpClient.h b/trantor/net/TcpClient.h index 8d885da9..02dfbd84 100644 --- a/trantor/net/TcpClient.h +++ b/trantor/net/TcpClient.h @@ -145,6 +145,16 @@ class TRANTOR_EXPORT TcpClient : NonCopyable, connectionErrorCallback_ = cb; } + /** + * @brief Set the create socket error callback. + * + * @param cb The callback is called when an error occurs create socket + */ + void setSocketErrorCallback(const SocketErrorCallback &cb) + { + socketErrorCallback_ = cb; + } + /** * @brief Set the message callback. * @@ -245,6 +255,7 @@ class TRANTOR_EXPORT TcpClient : NonCopyable, RecvMessageCallback messageCallback_; WriteCompleteCallback writeCompleteCallback_; SSLErrorCallback sslErrorCallback_; + SocketErrorCallback socketErrorCallback_; std::atomic_bool retry_; // atomic std::atomic_bool connect_; // atomic // always in loop thread diff --git a/trantor/net/callbacks.h b/trantor/net/callbacks.h index b81f96ee..19b44f8e 100644 --- a/trantor/net/callbacks.h +++ b/trantor/net/callbacks.h @@ -16,6 +16,7 @@ #include #include +#include namespace trantor { enum class SSLError @@ -34,6 +35,7 @@ using TcpConnectionPtr = std::shared_ptr; using RecvMessageCallback = std::function; using ConnectionErrorCallback = std::function; +using SocketErrorCallback = std::function; using ConnectionCallback = std::function; using CloseCallback = std::function; using WriteCompleteCallback = std::function; diff --git a/trantor/net/inner/Connector.cc b/trantor/net/inner/Connector.cc index adbf1f09..458aebe0 100644 --- a/trantor/net/inner/Connector.cc +++ b/trantor/net/inner/Connector.cc @@ -11,6 +11,7 @@ * * */ +#include #include "Connector.h" #include "Channel.h" @@ -78,7 +79,18 @@ void Connector::startInLoop() void Connector::connect() { socketHanded_ = false; - fd_ = Socket::createNonblockingSocketOrDie(serverAddr_.family()); + bool flag = (socketErrorCallback_ ? false : true); + fd_ = Socket::createNonblockingSocketOrDie(serverAddr_.family(), flag); + if (fd_ < 0) + { + std::stringstream error; + if (errno != 0) + { + error << strerror_tl(errno) << " (errno=" << errno << ") "; + } + socketErrorCallback_(error.str()); + return; + } if (sockOptCallback_) sockOptCallback_(fd_); errno = 0; diff --git a/trantor/net/inner/Connector.h b/trantor/net/inner/Connector.h index 3dca4847..25d8bb92 100644 --- a/trantor/net/inner/Connector.h +++ b/trantor/net/inner/Connector.h @@ -29,6 +29,8 @@ class Connector : public NonCopyable, using NewConnectionCallback = std::function; using ConnectionErrorCallback = std::function; using SockOptCallback = std::function; + using SocketErrorCallback = std::function; + Connector(EventLoop *loop, const InetAddress &addr, bool retry = true); Connector(EventLoop *loop, InetAddress &&addr, bool retry = true); ~Connector(); @@ -56,6 +58,14 @@ class Connector : public NonCopyable, { sockOptCallback_ = std::move(cb); } + void setSockErrorCallback(const SocketErrorCallback &cb) + { + socketErrorCallback_ = cb; + } + void setSockErrorCallback(SocketErrorCallback &&cb) + { + socketErrorCallback_ = std::move(cb); + } const InetAddress &serverAddress() const { return serverAddr_; @@ -68,6 +78,8 @@ class Connector : public NonCopyable, NewConnectionCallback newConnectionCallback_; ConnectionErrorCallback errorCallback_; SockOptCallback sockOptCallback_; + SocketErrorCallback socketErrorCallback_; + enum class Status { Disconnected, diff --git a/trantor/net/inner/Socket.h b/trantor/net/inner/Socket.h index 8cce9ddd..c4f76fe9 100644 --- a/trantor/net/inner/Socket.h +++ b/trantor/net/inner/Socket.h @@ -28,7 +28,7 @@ namespace trantor class Socket : NonCopyable { public: - static int createNonblockingSocketOrDie(int family) + static int createNonblockingSocketOrDie(int family, bool flag = true) { #ifdef __linux__ int sock = ::socket(family, @@ -41,7 +41,8 @@ class Socket : NonCopyable if (sock < 0) { LOG_SYSERR << "sockets::createNonblockingOrDie"; - exit(1); + if (flag) + exit(1); } LOG_TRACE << "sock=" << sock; return sock; diff --git a/trantor/tests/TcpClientTest.cc b/trantor/tests/TcpClientTest.cc index bbbb33f1..9b374135 100644 --- a/trantor/tests/TcpClientTest.cc +++ b/trantor/tests/TcpClientTest.cc @@ -76,6 +76,8 @@ int main() buf->retrieveAll(); conn->shutdown(); }); + client[i]->setSocketErrorCallback( + [](std::string error) { LOG_ERROR << error; }); client[i]->connect(); } loop.loop(); From 58885cec028f820f8cb9b13e9ee668b33f6a689a Mon Sep 17 00:00:00 2001 From: fantasy-peak <1356346239@qq.com> Date: Thu, 29 Aug 2024 15:13:03 +0800 Subject: [PATCH 2/2] Remove useless atomic_load_explicit --- trantor/net/TcpClient.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/trantor/net/TcpClient.cc b/trantor/net/TcpClient.cc index ae405d8a..97d3d7e6 100644 --- a/trantor/net/TcpClient.cc +++ b/trantor/net/TcpClient.cc @@ -80,8 +80,7 @@ TcpClient::~TcpClient() return; } assert(loop_ == connection_->getLoop()); - auto conn = - std::atomic_load_explicit(&connection_, std::memory_order_relaxed); + auto conn = connection_; loop_->runInLoop([conn = std::move(conn)]() { conn->setCloseCallback([](const TcpConnectionPtr &connPtr) mutable { connPtr->getLoop()->queueInLoop(