52 lines
1.5 KiB
C++
52 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include <cassert>
|
|
#include <spdlog/spdlog.h>
|
|
#include <string>
|
|
#include <sys/socket.h>
|
|
#include <vector>
|
|
|
|
#include "helpers/string.hpp"
|
|
|
|
class SocketHelper {
|
|
|
|
public:
|
|
typedef struct SocketMessage {
|
|
std::string eventType;
|
|
std::string eventData;
|
|
} SocketMessage;
|
|
|
|
static std::vector<SocketMessage> parseSocketMessage(int socketFd, const std::string &delimiter) {
|
|
char buffer[4096];
|
|
std::string data;
|
|
|
|
ssize_t bytesRead = recv(socketFd, buffer, sizeof(buffer) - 1, 0);
|
|
if (bytesRead > 0) {
|
|
buffer[bytesRead] = '\0';
|
|
data = std::string(buffer);
|
|
} else if (bytesRead == 0) {
|
|
spdlog::warn("Socket closed by peer");
|
|
} else {
|
|
spdlog::error("Error reading from socket");
|
|
}
|
|
|
|
auto delimiterPos = data.find(delimiter);
|
|
|
|
if (delimiterPos == std::string::npos) {
|
|
assert(false && "Delimiter not found in socket message");
|
|
}
|
|
|
|
auto splitMessages = StringHelper::split(data, '\n');
|
|
auto splitMessagesFinal = std::vector<SocketMessage>();
|
|
for (auto splitMessage : splitMessages) {
|
|
SocketMessage message;
|
|
auto messageCommandVector = StringHelper::split(splitMessage, delimiter);
|
|
|
|
message.eventType = messageCommandVector[0];
|
|
message.eventData = messageCommandVector.size() > 1 ? messageCommandVector[1] : "";
|
|
splitMessagesFinal.push_back(message);
|
|
}
|
|
|
|
return splitMessagesFinal;
|
|
}
|
|
}; |