summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-03-13 22:56:37 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-03-20 23:45:00 +0800
commitbcf30ffc53d7cf007f0bcd1ba9aca44fe2a2acde (patch)
treefa0fd197c1820cdd832182b51a64bd0d7b808fb5 /src
parentb000ae9e41b8699d1c7d6eefa0441ee05c970d25 (diff)
session(SRecvData::data): use std::string instead of char*
Diffstat (limited to 'src')
-rw-r--r--src/session.cpp41
-rw-r--r--src/session.hpp5
2 files changed, 30 insertions, 16 deletions
diff --git a/src/session.cpp b/src/session.cpp
index 228f183..61e1402 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -4,6 +4,7 @@
#include "server.hpp"
#include "sessionManager.hpp"
#include <arpa/inet.h>
+#include <algorithm>
#include <cerrno>
#include <cstring>
#include <sys/socket.h>
@@ -66,23 +67,35 @@ void CSession::recvLoop() {
}
}
+bool CSession::SRecvData::isEmpty() const {
+ return data.empty() || std::ranges::all_of(data, [](char c) { return std::isspace(c); });
+}
+
+void CSession::SRecvData::sanitize() {
+ if (!data.empty() && data.back() == '\n')
+ data.pop_back();
+
+ if (const auto start = data.find_first_not_of(" \t\r\n"); start != std::string::npos) {
+ const auto end = data.find_last_not_of(" \t\r\n");
+ data = data.substr(start, end - start + 1);
+ } else
+ data.clear();
+}
+
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->data.resize(recvData->size);
+ ssize_t size = recv(m_sockfd.get(), &recvData->data[0], recvData->size, 0);
+
+ if (size < 0) {
recvData->good = false;
onErrno(READ);
- }
- if (dataSize == 0) {
+ } else if (size == 0)
recvData->good = false;
// onDisconnect();
- }
-
- if (dataSize > 0) {
- recvData->data = std::string(buffer, dataSize);
- }
+ else
+ recvData->data.resize(size);
onRecv(*recvData);
m_isReading = false;
@@ -113,16 +126,12 @@ bool CSession::registerSession() {
if (!recvData->good)
return false;
- if (recvData->data.empty() || recvData->data[0] == '\n' || recvData->data[0] == ' ') {
+ recvData->sanitize();
+ if (recvData->isEmpty()) {
write("Name cannot be empty");
return registerSession();
}
- // 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();
diff --git a/src/session.hpp b/src/session.hpp
index 77687f9..d7bc11c 100644
--- a/src/session.hpp
+++ b/src/session.hpp
@@ -14,9 +14,14 @@ class CSession {
struct SRecvData {
std::string data;
+ const size_t size = 1024;
bool good = true;
+
+ bool isEmpty() const;
+ void sanitize();
};
+
std::string getName();
void setSelf(std::pair<std::jthread, std::shared_ptr<CSession>> *self);