From b3ec1a7891238c759dba4877e913bdbc4bdc64c4 Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Sat, 7 Dec 2024 15:04:50 +0100 Subject: [PATCH] initial implementation --- main.cpp | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..5a8affb --- /dev/null +++ b/main.cpp @@ -0,0 +1,104 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PORT 54321 + +std::string exec(std::string cmd) { + std::array buffer; + std::string result; + std::unique_ptr pipe(popen(cmd.c_str(), "r"), + [](FILE *f) -> void { + // wrapper to ignore the return + // value from pclose() is + // needed with newer versions + // of gnu g++ + std::ignore = pclose(f); + }); + if (!pipe) { + throw std::runtime_error("popen() failed!"); + } + while (fgets(buffer.data(), static_cast(buffer.size()), pipe.get()) != + nullptr) { + result += buffer.data(); + } + return result; +} + +int serverSocket; + +void safe_exit(int code) { + + std::clog << "Exiting\n"; + close(serverSocket); + exit(code); +} + +int main(int argc, char *argv[]) { + + // signal handlers + signal(SIGTERM, safe_exit); + signal(SIGINT, safe_exit); + signal(SIGQUIT, safe_exit); + signal(SIGHUP, safe_exit); + + // error signal handlers + signal(SIGSEGV, safe_exit); + + // creating socket + serverSocket = socket(AF_INET, SOCK_STREAM, 0); + + // specifying the address + sockaddr_in serverAddress; + serverAddress.sin_family = AF_INET; + serverAddress.sin_port = htons(PORT); + serverAddress.sin_addr.s_addr = INADDR_ANY; + + // binding socket. + while (bind(serverSocket, (struct sockaddr *)&serverAddress, + sizeof(serverAddress)) != 0) { + std::cerr << "error binding socket retring\n"; + sleep(2); + } + + // listening to the assigned socket + listen(serverSocket, 5); + + // accepting connection request + int clientSocket = accept(serverSocket, nullptr, nullptr); + + // recieving data + char buffer[1024] = {0}; + { + int RecvRetVal = recv(clientSocket, buffer, sizeof(buffer), 0); + if (RecvRetVal > sizeof(buffer) || RecvRetVal < 0) { + std::cerr << "recv() returned an error code\n"; + return RecvRetVal; + } + } + std::cout << "Message from client: " << buffer << std::endl; + + // closing the socket. + close(serverSocket); + + return 0; +} \ No newline at end of file