From 1daf8f41ae41031cbae278566d96f2eae071dd54 Mon Sep 17 00:00:00 2001 From: Aadhavan Srinivasan Date: Sun, 28 Jan 2024 23:36:14 -0500 Subject: [PATCH] Created 'client' and 'server' classes, using easysock --- client.hpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ server.hpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 client.hpp create mode 100644 server.hpp diff --git a/client.hpp b/client.hpp new file mode 100644 index 0000000..6708b66 --- /dev/null +++ b/client.hpp @@ -0,0 +1,59 @@ +#include "easysock.h" +#include + +/* +Client class - Defines a TCP/UDP client. +- The constructor takes in a **remote** address and port, and connects the client to that address/port. +*/ + +class Client { +private: + int ip_ver; + char protocol; + int port; + int sock_fd; + std::string address; + + void create_socket() { + struct sockaddr* dest = (struct sockaddr *)malloc(sizeof(struct sockaddr)); + this->sock_fd = create_remote(this->ip_ver, this->protocol, this->address.data(), this->port, dest); + } + +public: + Client(int ip_ver, char protocol, const char* address, int port) { + /* Error checking */ + if (ip_ver != 4 && ip_ver != 6) { + throw std::invalid_argument("Invalid IP address type"); + } + if (port < 1024 || port > 65535) { + throw std::invalid_argument("Invalid port"); + } + if (protocol != 'T' && protocol != 'U') { + throw std::invalid_argument("Invalid protocol"); + } + + this->ip_ver = ip_ver; + this->protocol = protocol; + this->port = port; + this->address = std::string(address); + create_socket(); + } + + void sendAll(std::string to_send) { + int str_length = to_send.length(); + int num_bytes_sent = 0; /* Number of bytes sent in one call to send */ + int total_bytes_sent = 0; /* Total number of bytes sent */ + + while (total_bytes_sent < str_length) { + num_bytes_sent = send(this->getSockFD(), to_send.substr(total_bytes_sent).data(), str_length - total_bytes_sent, 0); + total_bytes_sent += num_bytes_sent; + } + + return; + } + + int getSockFD() { + return sock_fd; + } + +}; diff --git a/server.hpp b/server.hpp new file mode 100644 index 0000000..0890351 --- /dev/null +++ b/server.hpp @@ -0,0 +1,62 @@ +#include "easysock.h" +#include + +/* +Server class - Defines a TCP/UDP server. +- The constructor takes in a **local** address and port, on which the server listens. +*/ + +class Server { +private: + int ip_ver; + char protocol; + int port; + int sock_fd; + std::string address; + + void create_socket() { + struct sockaddr* dest = (struct sockaddr *)malloc(sizeof(struct sockaddr)); + this->sock_fd = create_local(this->ip_ver, this->protocol, this->address.data(), this->port, dest); + } + +public: + Server(int ip_ver, char protocol, int port) { + /* Error checking */ + if (ip_ver != 4 && ip_ver != 6) { + throw std::invalid_argument("Invalid IP address type"); + } + if (port < 1024 || port > 65535) { + throw std::invalid_argument("Invalid port"); + } + if (protocol != 'T' && protocol != 'U') { + throw std::invalid_argument("Invalid protocol"); + } + + this->ip_ver = ip_ver; + this->protocol = protocol; + this->port = port; + if (ip_ver == 4) { + this->address = "127.0.0.1"; + } else if (ip_ver == 6) { + this->address = "::1"; + } + + create_socket(); + } + + + std::string recvAll() { + std::string string = std::string(); + char* buffer = (char *)malloc(100); + while (recv(this->getSockFD(), buffer, 100, 0) != 0) { + string.append(std::string(buffer)); + } + + return string; + } + + int getSockFD() { + return sock_fd; + } + +};