Defined a parent 'socket' class that both 'Client' and 'Server' can inherit from
This commit is contained in:
		
							
								
								
									
										87
									
								
								includes/sock.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								includes/sock.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
		Reference in New Issue
	
	Block a user