You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
1.9 KiB
C++

#include "easysock.hpp"
#include <iostream>
#include <errno.h>
#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);
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;
}
};