#include #include "includes/client.hpp" #include "includes/sock.hpp" #include "includes/easysock.h" /* Destructor - closes any open sockets */ Client::~Client() { free(dest); close(this->other_socket); close(this->sock_fd); } /* Creates a client socket. This method extends the parent method, and should be called immediately after the constructor. It also tries to connect to the address specified in the constructor, and will throw an exception if that fails. The exception thrown is an integer, that corresponds to the errno returned by the failing function. This enables a client to 'catch' the thrown exception, and print the corresponding error message using strerror(). This function also sets a timeout of 100ms for UDP sockets. */ void Client::create_socket() { Sock::create_socket(); this->sock_fd = create_remote(this->ip_ver, this->protocol, this->address.data(), this->port, dest); if (this->sock_fd < 0) { throw (this->sock_fd * -1); } // if (protocol == ES_UDP) { // struct timeval tv; // tv.tv_sec = 0; // tv.tv_usec = 10000; // setsockopt(this->sock_fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); // } } /* Sends given data to the peer socket. This method is overriden, because a TCP server socket has a 'peer' socket, that it must send to and receive data from. A client socket (TCP or UDP) does not have this requirement. Therefore, while both sendAll methods perform the same actions, they do so using different sockets. */ void Client::sendAll(std::string to_send) { this->other_socket = this->sock_fd; Sock::sendAll(to_send); } /* Receives data from peer socket, and returns it. See above for better explanation of why this method is overriden. */ char* Client::recvAll() { this->other_socket = this->sock_fd; return Sock::recvAll(); } /* Same as function above, but calls Sock::recvAllNB() */ char* Client::recvAllNB() { this->other_socket = this->sock_fd; return Sock::recvAllNB(); } /* Returns the type of socket based on the global constants set in sock.hpp */ int Client::get_type() { return SOCK_CLIENT; }