Defined a parent 'socket' class that both 'Client' and 'Server' can inherit from
parent
f9bfefe3ad
commit
2e6b01a9bb
@ -0,0 +1,87 @@
|
||||
#ifndef _SOCK_CLASS
|
||||
#define _SOCK_CLASS
|
||||
|
||||
#include "easysock.hpp"
|
||||
#include <iostream>
|
||||
#include <cerrno>
|
||||
#include "exception_consts.hpp"
|
||||
|
||||
class Sock {
|
||||
/* Define a parent class of client and server, that can be used in main.cpp, instead of defining a client and server. This will allow me to create a struct for Mode, that can store either a client or a server, depending on what mode the game is in. */
|
||||
protected:
|
||||
int ip_ver;
|
||||
char protocol;
|
||||
int port;
|
||||
int sock_fd;
|
||||
std::string address;
|
||||
struct sockaddr* dest;
|
||||
|
||||
void create_socket() {
|
||||
dest = (struct sockaddr *)malloc(sizeof(struct sockaddr));
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
Sock() {}
|
||||
|
||||
Sock(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;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue