summaryrefslogtreecommitdiff
path: root/src/session.cpp
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-03-13 18:55:17 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-03-20 23:45:00 +0800
commit95fe8f6c660a1c3bf91b5ab78f95ef0c35d8990c (patch)
tree693c755b3050a7d62dfe4266e701c0edb2fbffd4 /src/session.cpp
parent80ba94e84ed4f402862725bff3569e5bc563f5ea (diff)
perf(session): use pointer for SRecvData
Diffstat (limited to 'src/session.cpp')
-rw-r--r--src/session.cpp44
1 files changed, 27 insertions, 17 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);