mcping/Connection.cpp

84 lines
1.8 KiB
C++

#include "Connection.h"
#include <sys/socket.h>
#include <arpa/inet.h>
#include <iostream>
#include <unistd.h>
#include <string.h>
void Connection::p_HandleError(){
std::cout << "an error occured during execution" << std::endl;
switch (error) {
case ErrorTypes::socket_creation:
perror("error while trying to create a file descriptor");
break;
case ErrorTypes::get_ip:
perror("error while trying to get ip");
break;
case ErrorTypes::connect:
perror("error while trying to connect");
break;
default:
std::cerr << "An unknown error occured" << std::endl;
}
}
int Connection::status(){
return static_cast<int>(error);
}
Connection::Connection(std::string server_ip, int port){
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0){
error = ErrorTypes::socket_creation;
}
in_addr in_a;
if(!inet_aton(server_ip.data(), &in_a)){
error = ErrorTypes::get_ip;
}
sockaddr_in addr({ AF_INET, htons(port), in_a });
if(connect(fd, (sockaddr*) &addr, sizeof(addr)) != 0){
error = ErrorTypes::connect;
}
}
Connection::~Connection(){
close(fd);
}
bool Connection::send(std::vector<Payload> payloads, bool size){
if(size){
unsigned char _size = payloads.size();
::send(fd, &_size , sizeof(_size), 0);
}
for (Payload& p : payloads) {
::send(fd, p.getData() , p.getSize(), 0);
}
return true;
}
bool Connection::send(Payload payload, bool size){
return send(std::vector<Payload>{payload}, size);
}
Payload Connection::recv(){
Payload ret;
ssize_t size = 0, bytes;
std::vector<unsigned char> received(100);
while((bytes = ::recv(fd, received.data() + size, 100, 0)) > 0){
size += bytes;
received.resize(size+100);
}
if(bytes == 0){
received.shrink_to_fit();
ret.setData(received);
return ret;
}
//Error Handling
error = ErrorTypes::recv;
return ret;
}