1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
#include "session.hpp"
#include <cmath>
#include <ostream>
#include <sys/socket.h>
#include <print>
#include <cerrno>
#include <cstring>
CSession::CSession(Hyprutils::OS::CFileDescriptor sockfd) : m_sockfd(std::move(sockfd)) {
if (!m_sockfd.isValid())
throw std::runtime_error("Failed to create socket");
}
CSession::~CSession() {
m_sockfd.reset();
}
void CSession::onConnect() const {
std::println("Client connected");
}
void CSession::onDisconnect() const {
std::println("Client disconnected");
}
void CSession::onErrno() const {
std::println("Error: {}", strerror(errno));
}
void CSession::onRecv(SRecvData &data) const {
std::println("Received: {}", data.data, data.dataSize);
}
void CSession::recvManager() {
while (true) {
CSession::SRecvData recvData = read();
if (!recvData.good) {
break;
}
}
}
CSession::SRecvData CSession::read() {
SRecvData recvData;
ssize_t dataSize = recv(m_sockfd.get(), recvData.data, recvData.dataSize, 0);
if (dataSize < 0) {
recvData.good = false;
onErrno();
}
if (dataSize == 0) {
recvData.good = false;
onDisconnect();
}
onRecv(recvData);
return recvData;
}
CSession::SRecvData CSession::read(std::string &msg) {
write(msg);
SRecvData recvData;
ssize_t dataSize = recv(m_sockfd.get(), recvData.data, recvData.dataSize, 0);
if (dataSize > 0) {
recvData.good = false;
if (dataSize < 0)
onErrno();
if (dataSize == 0)
onDisconnect();
}
onRecv(recvData);
return recvData;
}
void CSession::run() {
onConnect();
// std::jthread recvThread(&CSession::recvManager, this);
registerSession();
recvManager();
}
bool CSession::registerSession() {
SRecvData rervData = read((std::string&)"Name: ");
if (!rervData.good) {
return false;
}
m_name = rervData.data;
std::println("Client registered as: {}", m_name);
return true;
}
bool CSession::isValid() const {
return m_sockfd.isValid() && !m_name.empty();
}
bool CSession::write(const std::string &msg) const {
bool bad = false;
ssize_t bytes_sent = send(m_sockfd.get(), msg.c_str(), msg.size(), 0);
if (bytes_sent < 0) {
bad = true;
onErrno();
}
return bad;
}
std::string CSession::getName() const {
return m_name;
}
|