diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-03-13 18:55:17 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-03-20 23:45:00 +0800 |
| commit | 95fe8f6c660a1c3bf91b5ab78f95ef0c35d8990c (patch) | |
| tree | 693c755b3050a7d62dfe4266e701c0edb2fbffd4 /src | |
| parent | 80ba94e84ed4f402862725bff3569e5bc563f5ea (diff) | |
perf(session): use pointer for SRecvData
Diffstat (limited to 'src')
| -rw-r--r-- | src/session.cpp | 44 | ||||
| -rw-r--r-- | src/session.hpp | 11 |
2 files changed, 32 insertions, 23 deletions
diff --git a/src/session.cpp b/src/session.cpp index 8991b52..6744fc9 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -49,7 +49,7 @@ void CSession::onErrno(eEventType eventType) { } void CSession::onRecv(const SRecvData &data) { - log(LOG, "Received: {}", data.data, data.dataSize); + log(LOG, "Received: {}", data.data); } void CSession::onSend(const std::string &msg) { @@ -58,32 +58,38 @@ void CSession::onSend(const std::string &msg) { void CSession::recvLoop() { while (true) { - SRecvData recvData = read(NFormatter::fmt(NONE, "{}: ", m_name)); - if (!recvData.good) + auto recvData = read(NFormatter::fmt(NONE, "{}: ", m_name)); + if (!recvData->good) break; - g_pChatManager->newMessage({.msg = recvData.data, .username = m_name}); + g_pChatManager->newMessage({.msg = recvData->data, .username = m_name}); } } -CSession::SRecvData CSession::read() { - SRecvData recvData; - ssize_t dataSize = recv(m_sockfd.get(), recvData.data, recvData.dataSize, 0); +std::unique_ptr<CSession::SRecvData> CSession::read() { + auto recvData = std::make_unique<SRecvData>(); + char buffer[1024] = {0}; + + ssize_t dataSize = recv(m_sockfd.get(), buffer, sizeof(buffer), 0); if (dataSize < 0) { - recvData.good = false; + recvData->good = false; onErrno(READ); } if (dataSize == 0) { - recvData.good = false; + recvData->good = false; // onDisconnect(); } - onRecv(recvData); + if (dataSize > 0) { + recvData->data = std::string(buffer, dataSize); + } + + onRecv(*recvData); m_isReading = false; return recvData; } -CSession::SRecvData CSession::read(const std::string &msg) { +std::unique_ptr<CSession::SRecvData> CSession::read(const std::string &msg) { write("{}", msg, false); m_isReading = true; return read(); @@ -103,22 +109,26 @@ void CSession::run() { } bool CSession::registerSession() { - SRecvData recvData = read("Name: "); - if (!recvData.good) + auto recvData = read("Name: "); + if (!recvData->good) return false; - if (recvData.data[0] == '\n' || recvData.data[0] == ' ') { + if (recvData->data.empty() || recvData->data[0] == '\n' || recvData->data[0] == ' ') { write("Name cannot be empty"); return registerSession(); } - *std::remove(recvData.data, recvData.data + strlen(recvData.data), '\n') = '\0'; - if (g_pSessionManager->nameExists(recvData.data)) { + // Remove trailing newline if present + if (!recvData->data.empty() && recvData->data.back() == '\n') { + recvData->data.pop_back(); + } + + if (g_pSessionManager->nameExists(recvData->data)) { write("Name already exists"); return registerSession(); } - this->m_name = recvData.data; + this->m_name = recvData->data; log(LOG, "Client registered as: {}", m_name); diff --git a/src/session.hpp b/src/session.hpp index 4f5adb2..65aa7a0 100644 --- a/src/session.hpp +++ b/src/session.hpp @@ -13,16 +13,15 @@ class CSession { ~CSession(); struct SRecvData { - char data[1024] = {0}; - ssize_t dataSize = sizeof(data); - bool good = true; + std::string data; + bool good = true; }; std::string getName(); - void setSelf(std::pair<std::jthread, std::shared_ptr<CSession>> *self); + void setSelf(std::pair<std::jthread, std::shared_ptr<CSession>> *self); - SRecvData read(); - SRecvData read(const std::string &msg); + std::unique_ptr<SRecvData> read(); + std::unique_ptr<SRecvData> read(const std::string &msg); bool write(const std::string &msg); template <typename... Args> bool write(std::format_string<Args...> fmt, Args &&...args); |
