#include "easysock.hpp" #include #include #include "exception_consts.hpp" /* 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); if (sock_fd < 0) { if (sock_fd * -1 == ECONNREFUSED) { throw EXCEPT_CONNREFUSED; } } } public: Client() {} 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); /* Check to see if the given IP address matches the given ip_ver */ if ((check_ip_ver(address) != 6 && ip_ver == 6) || (check_ip_ver(address) != 4 && ip_ver == 4)) { throw std::invalid_argument("Invalid IP address for given type."); } try { create_socket(); } catch (int e) { throw; } } 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; } };