Repository navigation
Expand file tree
/
Copy pathnetagent_s_linux.cpp
More file actions
85 lines (75 loc) · 2.61 KB
/
Copy pathnetagent_s_linux.cpp
File metadata and controls
85 lines (75 loc) · 2.61 KB
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
#include "netagent.h"
// Implementation: https://www.geeksforgeeks.org/cpp/socket-programming-in-cpp/
NetServer::~NetServer() {
for (int clientSocket : clientSockets) {
close(clientSocket);
}
close(serverSocket);
}
NetServer::NetServer(int port) {
init(port);
}
int NetServer::init(uint16_t listenPort, int maxConnections) {
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == -1) {
cerr << "Failed to create socket" << endl;
return -1;
}
memset(&serverAddress, 0, sizeof(serverAddress));
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(listenPort);
serverAddress.sin_addr.s_addr = INADDR_ANY;
if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
cerr << "Failed to bind socket" << endl;
return -1;
}
if (listen(serverSocket, maxConnections) < 0) {
cerr << "Failed to listen on socket" << endl;
return -1;
}
return 0;
}
int NetServer::acceptNewClient() {
int clientSocket = accept(serverSocket, nullptr, nullptr);
if (clientSocket == -1) {
cerr << "Failed to accept new client" << endl;
return -1;
}
clientSockets.push_back(clientSocket);
return clientSocket;
}
int NetServer::receiveData(int clientSocket, char* buffer, int bufferSize) {
memset(buffer, 0, bufferSize);
int bytesReceived = recv(clientSocket, buffer, bufferSize, 0);
if (bytesReceived == -1) {
cerr << "Failed to receive data from client" << endl;
return NARETURN::ERR;
} else if (bytesReceived == 0) {
removeAndCloseClientSocket(clientSocket);
cerr << "Connection closed by client" << endl;
return NARETURN::CONN_CLOSED_BY_PEER;
}
return bytesReceived;
}
int NetServer::sendData(int clientSocket, const char* data, int len) {
int bytesSent = send(clientSocket, data, len, 0);
if (bytesSent == -1) {
removeAndCloseClientSocket(clientSocket);
cerr << "Failed to send data to client" << endl;
return NARETURN::CONN_CLOSED_BY_PEER;
}
return bytesSent;
}
void NetServer::closeConnection(int clientSocket) {
removeAndCloseClientSocket(clientSocket);
}
void NetServer::removeAndCloseClientSocket(int clientSocket) {
auto it = std::find(clientSockets.begin(), clientSockets.end(), clientSocket);
if (it != clientSockets.end()) {
close(clientSocket);
clientSockets.erase(it);
}
}
bool NetServer::isConnected(int clientSocket) {
return std::find(clientSockets.begin(), clientSockets.end(), clientSocket) != clientSockets.end();
}