diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-05-26 14:07:35 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-06-07 17:30:26 +0800 |
| commit | 31b2280f295a9afb86fc53ee534bbf48ecca8903 (patch) | |
| tree | 0c23459ab32fa3b305eb82c86a949ec07e9b300f /src/session.cpp | |
| parent | e30f6eb6872d57f7da764690589c2f0c9ffdb53b (diff) | |
v1, sigabrt on client disconnect
Diffstat (limited to 'src/session.cpp')
| -rw-r--r-- | src/session.cpp | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/src/session.cpp b/src/session.cpp index 116c9bc..afcb79b 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -10,6 +10,7 @@ #include <cerrno> #include <cstring> #include <memory> +#include <mutex> #include <sys/socket.h> CSession::CSession() { @@ -18,11 +19,14 @@ CSession::CSession() { if (!m_sockfd->isValid()) throw std::runtime_error("session: Failed to create socket"); - m_ip.resize(INET_ADDRSTRLEN); - inet_ntop(AF_INET, &m_addr.sin_addr, &m_ip[0], INET_ADDRSTRLEN); - m_ip.resize(strlen(m_ip.c_str())); - m_port = ntohs(m_addr.sin_port); - m_isAdmin = std::ranges::any_of(m_adminIps, [this](const char *ip) { return m_ip == ip; }); + { + std::lock_guard<std::mutex> lock(m_mutex); + m_ip.resize(INET_ADDRSTRLEN); + inet_ntop(AF_INET, &m_addr.sin_addr, &m_ip[0], INET_ADDRSTRLEN); + m_ip.resize(strlen(m_ip.c_str())); + m_port = ntohs(m_addr.sin_port); + m_isAdmin = std::ranges::any_of(m_adminIps, [this](const char *ip) { return m_ip == ip; }); + } log(LOG, "Client {} connected on port {}", m_ip, m_port); @@ -115,7 +119,12 @@ std::unique_ptr<CSession::SRecvData> CSession::read() { auto recvData = std::make_unique<SRecvData>(); recvData->data.resize(recvData->size); - ssize_t size = recv(m_sockfd->get(), &recvData->data[0], recvData->size, 0); + + size_t size; + { + std::lock_guard<std::mutex> lock(m_readMutex); + size = recv(m_sockfd->get(), &recvData->data[0], recvData->size, 0); + } if (size < 0) { recvData->good = false; @@ -130,7 +139,10 @@ std::unique_ptr<CSession::SRecvData> CSession::read() { #ifdef DEBUG onRecv(*recvData); #endif - m_szReading.reset(); + { + std::lock_guard<std::mutex> lock(m_readingMutex); + m_szReading.reset(); + } return recvData; } @@ -210,7 +222,10 @@ bool CSession::isValid() { int err = 0; socklen_t size = sizeof(err); - return getsockopt(m_sockfd->get(), SOL_SOCKET, SO_ERROR, &err, &size) >= 0 && err == 0; + { + std::lock_guard<std::mutex> lock(m_mutex); + return getsockopt(m_sockfd->get(), SOL_SOCKET, SO_ERROR, &err, &size) >= 0 && err == 0; + } } template <typename... Args> @@ -226,14 +241,21 @@ bool CSession::write(eFormatType type, std::format_string<Args...> fmt, Args &&. return false; std::string msg = NFormatter::fmt(type, fmt, std::forward<Args>(args)...); - if (m_szReading) { - msg.insert(0, "\r"); - msg.append(*m_szReading); + { + std::lock_guard<std::mutex> lock(m_readingMutex); + + if (m_szReading) { + msg.insert(0, "\r"); + msg.append(*m_szReading); + } } - if (send(m_sockfd->get(), msg.c_str(), msg.size(), 0) < 0) { - onErrno(WRITE); - return false; + { + std::lock_guard<std::mutex> lock(m_writeMutex); + if (send(m_sockfd->get(), msg.c_str(), msg.size(), MSG_NOSIGNAL) < 0) { + onErrno(WRITE); + return false; + } } #ifdef DEBUG onSend(msg); |
