diff --git a/CMakeLists.txt b/CMakeLists.txt index 7197ee5a2c09051ae2c8fa7d99433f87fd09b232..ca4cee3e48a8e6a42f9a04a220dbfcc21883e492 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,6 @@ option(TCPPROTOCOL_BUILD_SHARED "Build tcpprotocol as a shared library." OFF) set(SOURCES src/TCP_Protocol.cpp - src/TCP_Protocol_Configurator.cpp ) diff --git a/deps/Base-DAQ b/deps/Base-DAQ index a2095e59d57271e3bef3422a67c6905fd237467c..2b4e8b039ec5da9ddd53720991c1b95f034e86fb 160000 --- a/deps/Base-DAQ +++ b/deps/Base-DAQ @@ -1 +1 @@ -Subproject commit a2095e59d57271e3bef3422a67c6905fd237467c +Subproject commit 2b4e8b039ec5da9ddd53720991c1b95f034e86fb diff --git a/include/TCP_Protocol.h b/include/TCP_Protocol.h index 5e5c715bcea8f3d969e5282c2ce68ca5f960cac0..67e6d19a0c8be23631d6eb01857575375c28afdf 100755 --- a/include/TCP_Protocol.h +++ b/include/TCP_Protocol.h @@ -3,10 +3,10 @@ * Created on: Mar 1, 2021 * Author: astrisw */ -#ifndef TCP_PROTOCOL_H_ -#define TCP_PROTOCOL_H_ +#pragma once #include +#include /* @@ -20,8 +20,6 @@ class TCPProtocol : public BaseProtocol{ protected: int srv_sock; int cli_sock; - std::string ip{}; - int port; void split_ip_port(const std::string& ip_port, std::string& ip, std::string& port); int m_connectToSrv(std::string ip, int port); int m_connectToCli(std::string ip, int port); @@ -31,12 +29,11 @@ protected: public: TCPProtocol(std::string ip, int prt); TCPProtocol(); + ~TCPProtocol(); - std::string getIp(){return ip;} - int getPort(){ return port;} - void setIp(std::string ip){ this->ip = ip;} - void setPort(int port){this->port = port;} + std::string ip; + int port; int connectToServer() override; int connectToClient() override; @@ -47,6 +44,23 @@ public: int receiveFromClient(PacketLib::BasePacket &) override; int sendToServer(PacketLib::BasePacket &) override; + friend class Builder; + class Builder { + protected: + TCPProtocol *protocol; + + public: + std::string ip_key { "ip" }; + std::string port_key { "port" }; + + Builder(); + Builder(std::string ip, int port); + ~Builder(); + void reset(); + Builder* configFrom(Configurators::BaseConfigurator *conf); + Builder* setIp(std::string ip); + Builder* setPort(int port); + TCPProtocol* getProtocol(); + }; }; } -#endif /* TCP_PROTOCOL_H_ */ diff --git a/src/TCP_Protocol.cpp b/src/TCP_Protocol.cpp index 0282343c7771aaad17220703e94eacdcb9c7f30e..7e32014f54b492802c1cb268c67e675040bae53b 100755 --- a/src/TCP_Protocol.cpp +++ b/src/TCP_Protocol.cpp @@ -7,24 +7,18 @@ #include #include +#include using namespace inaf::oasbo::ConnectionProtocols; -TCPProtocol::TCPProtocol() { - this->host = std::string("127.0.0.1:9003"); - std::string port { }; - split_ip_port(host, ip, port); - this->port = std::stoi(port); - this->srv_sock = -1; - this->cli_sock = -1; -} -TCPProtocol::TCPProtocol(std::string ip, int prt) { - this->host = std::string(ip).append(":").append(std::to_string(prt)); - this->ip = ip; - this->port = prt; - this->srv_sock = -1; - this->cli_sock = -1; +TCPProtocol::TCPProtocol() : + TCPProtocol("127.0.0.1", 9003) { } +TCPProtocol::TCPProtocol(std::string ip, int prt) : + srv_sock(-1), cli_sock(-1), ip(ip), port(prt) { + host = ip + ":" + std::to_string(port); +} + TCPProtocol::~TCPProtocol() { closeConnectionToClient(); closeConnectionToServer(); @@ -32,32 +26,33 @@ TCPProtocol::~TCPProtocol() { int TCPProtocol::sendToServer(PacketLib::BasePacket &pack) { int val = ::send(cli_sock, pack.getBinaryPointer(), - pack.getHeaderSize() + pack.getPayloadSize() + pack.getTailSize(), MSG_CONFIRM); + pack.getHeaderSize() + pack.getPayloadSize() + pack.getTailSize(), + MSG_CONFIRM); return val; } int TCPProtocol::receiveFromClient(PacketLib::BasePacket &pack) { ssize_t headerSize = pack.getHeaderSize(); uint8_t *buff = new uint8_t[pack.getPacketStructureByteSize()]; ssize_t rec = ::recv(this->srv_sock, &buff[0], headerSize, MSG_WAITALL); - if(rec == 0){ // connessione chiusa + if (rec == 0) { // connessione chiusa closeConnectionToClient(); delete buff; return 0; } - if(rec != headerSize){ + if (rec != headerSize) { delete buff; return -1; } pack.copyToBinaryPointer(buff, headerSize); - if(!pack.isRecognizedHeader()){ + if (!pack.isRecognizedHeader()) { resetPacket(pack, headerSize); delete buff; return -1; } int to_be_rcv = pack.getPayloadSize() + pack.getTailSize(); - rec += ::recv(this->srv_sock, &buff[headerSize],to_be_rcv, MSG_WAITALL); - if(rec != to_be_rcv + headerSize){ + rec += ::recv(this->srv_sock, &buff[headerSize], to_be_rcv, MSG_WAITALL); + if (rec != to_be_rcv + headerSize) { resetPacket(pack, headerSize); delete buff; return -1; @@ -100,9 +95,10 @@ bool TCPProtocol::isConnectedToServer() const { int TCPProtocol::m_connectToCli(std::string ip, int port) { std::cout << "Listening on: " << ip << ":" << port << std::endl; // Creating socket file descriptor - if(srv_sock == -1){ + if (srv_sock == -1) { if ((srv_sock = socket(AF_INET, SOCK_STREAM, 0)) == 0) { - perror("socket failed"); + std::cerr << "socket failed" << std::endl; + ; return -1; } } @@ -111,14 +107,16 @@ int TCPProtocol::m_connectToCli(std::string ip, int port) { servaddr.sin_addr.s_addr = ::inet_addr(ip.c_str()); servaddr.sin_port = htons(port); if (bind(srv_sock, (struct sockaddr*) &servaddr, sizeof(servaddr)) < 0) { - perror("bind failed"); + std::cerr << "TCP CONNECTION: Bind failed" << std::endl; + ; srv_sock = -1; return -1; } - std::cout << "Waiting for connection" << std::endl; + std::cout << "TCP CONNECTION: Waiting for connection" << std::endl; if (listen(srv_sock, 1) < 0) { - perror("listen error"); + std::cerr << "TCP CONNECTION: Listen error" << std::endl; + ; srv_sock = -1; return -1; } @@ -126,12 +124,13 @@ int TCPProtocol::m_connectToCli(std::string ip, int port) { int addrlen = sizeof(servaddr); if ((newSocket = accept(srv_sock, (struct sockaddr*) &servaddr, (socklen_t*) &addrlen)) < 0) { - perror("accept error"); + std::cerr << "TCP CONNECTION: accept error" << std::endl; + ; srv_sock = -1; return -1; } ::close(srv_sock); - std::cout << "Connected" << std::endl; + std::cout << "TCP CONNECTION: Connected" << std::endl; srv_sock = newSocket; return srv_sock; } @@ -139,7 +138,8 @@ int TCPProtocol::m_connectToSrv(std::string ip, int port) { int sock = 0; struct sockaddr_in cli_addr; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - printf("\n Socket creation error \n"); + std::cerr << "TCP CONNECTION: Socket creation error" << std::endl; + ; this->cli_sock = -1; return -1; } @@ -149,13 +149,16 @@ int TCPProtocol::m_connectToSrv(std::string ip, int port) { // Convert IPv4 and IPv6 addresses from text to binary form if (inet_pton(AF_INET, ip.c_str(), &cli_addr.sin_addr) <= 0) { - printf("\nInvalid address/ Address not supported \n"); + std::cerr << "TCP CONNECTION: Invalid address/ Address not supported" + << std::endl; + ; this->cli_sock = -1; return -1; } if (connect(sock, (struct sockaddr*) &cli_addr, sizeof(cli_addr)) < 0) { - printf("\nConnection Failed \n"); + std::cerr << "TCP CONNECTION: Connection Failed " << std::endl; + ; this->cli_sock = -1; return -1; } @@ -186,7 +189,57 @@ void TCPProtocol::split_ip_port(const std::string &ip_port, void TCPProtocol::resetPacket(PacketLib::BasePacket &pack, int bytes) { uint8_t *buff = new uint8_t[bytes]; std::memset(buff, 0, bytes); - int toBeReset = std::min(static_cast(pack.getPacketStructureByteSize()), bytes); + int toBeReset = std::min( + static_cast(pack.getPacketStructureByteSize()), bytes); pack.copyToBinaryPointer(buff, toBeReset); delete buff; } + +using P_B = TCPProtocol::Builder; +P_B::Builder() { + this->reset(); +} + +P_B::Builder(std::string ip, int port) { + this->protocol = new TCPProtocol(ip, port); + +} + +P_B::~Builder() { + delete protocol; +} + +void P_B::reset() { + this->protocol = new TCPProtocol(); +} + +P_B* P_B::configFrom(Configurators::BaseConfigurator *conf) { + std::string target = std::string("tcpprotocol"); + conf->readConfigFromSource(target); + std::map params = conf->getConfig(); + + std::string key = target+"_"+ip_key; + if (params.count(key) > 0) + protocol->ip = params[key]; + + key = target+"_"+port_key; + if (params.count(port_key) > 0) + protocol->port = std::stoi(params[key]); + return this; +} + +P_B* P_B::setIp(std::string ip) { + protocol->ip = ip; + return this; +} + +P_B* P_B::setPort(int port) { + protocol->port = port; + return this; +} + +TCPProtocol* P_B::getProtocol() { + TCPProtocol *result = this->protocol; + this->reset(); + return result; +}