From 5c9276b93e90a1799a0007e1117c71a38696f14f Mon Sep 17 00:00:00 2001 From: astri Date: Thu, 18 May 2023 19:58:08 +0200 Subject: [PATCH 1/3] configuration refactoring --- CMakeLists.txt | 1 - include/TCP_Protocol.h | 16 ++++------ src/TCP_Protocol.cpp | 72 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 70 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7197ee5..ca4cee3 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/include/TCP_Protocol.h b/include/TCP_Protocol.h index 5e5c715..abc16c0 100755 --- a/include/TCP_Protocol.h +++ b/include/TCP_Protocol.h @@ -20,23 +20,21 @@ 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); void resetPacket(inaf::oasbo::PacketLib::BasePacket &pack, int bytes); - - -public: TCPProtocol(std::string ip, int prt); TCPProtocol(); + +public: + ~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;} + class Builder; + + std::string ip; + int port; int connectToServer() override; int connectToClient() override; diff --git a/src/TCP_Protocol.cpp b/src/TCP_Protocol.cpp index 0282343..6bfa0b7 100755 --- a/src/TCP_Protocol.cpp +++ b/src/TCP_Protocol.cpp @@ -7,6 +7,7 @@ #include #include +#include using namespace inaf::oasbo::ConnectionProtocols; @@ -102,7 +103,7 @@ int TCPProtocol::m_connectToCli(std::string ip, int port) { // Creating socket file descriptor 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 +112,14 @@ 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 +127,12 @@ 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 +140,7 @@ 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 +150,13 @@ 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; } @@ -190,3 +191,56 @@ void TCPProtocol::resetPacket(PacketLib::BasePacket &pack, int bytes) { pack.copyToBinaryPointer(buff, toBeReset); delete buff; } + + +class TCPProtocol::Builder { +protected: + TCPProtocol *protocol; + +public: + + std::string ip_key{"ip"}; + std::string port_key{"port"}; + + Builder() { + this->reset(); + } + Builder(std::string ip, int port) { + this->protocol = new TCPProtocol(ip, port); + + } + ~Builder() { + delete protocol; + } + + void reset() { + this->protocol = new TCPProtocol(); + } + + Builder* configFrom(Configurators::BaseConfigurator *conf) { + std::map params = + conf->readConfig(); + if (params.count(ip_key) > 0) + protocol->ip = params[ip_key]; + if (params.count(port_key) > 0) + protocol->port = std::stoi(params[port_key]); + return this; + } + + Builder* setIp(std::string ip) { + protocol->ip = ip; + return this; + } + + Builder* setPort(int port) { + protocol->port = port; + return this; + } + + TCPProtocol* getProtocol() { + TCPProtocol *result = this->protocol; + this->reset(); + return result; + } +}; + -- GitLab From d6c69da378b1fd7bd9822a658163c74c966b326f Mon Sep 17 00:00:00 2001 From: astri Date: Thu, 25 May 2023 15:54:20 +0200 Subject: [PATCH 2/3] builder refacotr --- deps/Base-DAQ | 2 +- include/TCP_Protocol.h | 30 ++++++++++++---- src/TCP_Protocol.cpp | 77 +++++++++++++++++++----------------------- 3 files changed, 58 insertions(+), 51 deletions(-) diff --git a/deps/Base-DAQ b/deps/Base-DAQ index a2095e5..f118b02 160000 --- a/deps/Base-DAQ +++ b/deps/Base-DAQ @@ -1 +1 @@ -Subproject commit a2095e59d57271e3bef3422a67c6905fd237467c +Subproject commit f118b029ff73dc23989c5b648cd6175b968a9a14 diff --git a/include/TCP_Protocol.h b/include/TCP_Protocol.h index abc16c0..67e6d19 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 /* @@ -24,15 +24,14 @@ protected: int m_connectToSrv(std::string ip, int port); int m_connectToCli(std::string ip, int port); void resetPacket(inaf::oasbo::PacketLib::BasePacket &pack, int bytes); - TCPProtocol(std::string ip, int prt); - TCPProtocol(); + public: + TCPProtocol(std::string ip, int prt); + TCPProtocol(); ~TCPProtocol(); - class Builder; - std::string ip; int port; @@ -45,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 6bfa0b7..81cca39 100755 --- a/src/TCP_Protocol.cpp +++ b/src/TCP_Protocol.cpp @@ -193,54 +193,45 @@ void TCPProtocol::resetPacket(PacketLib::BasePacket &pack, int bytes) { } -class TCPProtocol::Builder { -protected: - TCPProtocol *protocol; - -public: +using P_B = TCPProtocol::Builder; +P_B::Builder() { + this->reset(); +} - std::string ip_key{"ip"}; - std::string port_key{"port"}; +P_B::Builder(std::string ip, int port) { + this->protocol = new TCPProtocol(ip, port); - Builder() { - this->reset(); - } - Builder(std::string ip, int port) { - this->protocol = new TCPProtocol(ip, port); - - } - ~Builder() { - delete protocol; - } +} - void reset() { - this->protocol = new TCPProtocol(); - } +P_B::~Builder() { + delete protocol; +} - Builder* configFrom(Configurators::BaseConfigurator *conf) { - std::map params = - conf->readConfig(); - if (params.count(ip_key) > 0) - protocol->ip = params[ip_key]; - if (params.count(port_key) > 0) - protocol->port = std::stoi(params[port_key]); - return this; - } +void P_B::reset() { + this->protocol = new TCPProtocol(); +} - Builder* setIp(std::string ip) { - protocol->ip = ip; - return this; - } +P_B* P_B::configFrom(Configurators::BaseConfigurator *conf) { + std::map params = conf->readConfig(); + if (params.count(ip_key) > 0) + protocol->ip = params[ip_key]; + if (params.count(port_key) > 0) + protocol->port = std::stoi(params[port_key]); + return this; +} - Builder* setPort(int port) { - protocol->port = port; - return this; - } +P_B* P_B::setIp(std::string ip) { + protocol->ip = ip; + return this; +} - TCPProtocol* getProtocol() { - TCPProtocol *result = this->protocol; - this->reset(); - return result; - } -}; +P_B* P_B::setPort(int port) { + protocol->port = port; + return this; +} +TCPProtocol * P_B::getProtocol() { + TCPProtocol *result = this->protocol; + this->reset(); + return result; +} -- GitLab From 573039c8e79cba398f98721df7e4393d9377630f Mon Sep 17 00:00:00 2001 From: astri Date: Sat, 3 Jun 2023 18:48:16 +0200 Subject: [PATCH 3/3] config refactorig ok --- deps/Base-DAQ | 2 +- src/TCP_Protocol.cpp | 78 ++++++++++++++++++++++++-------------------- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/deps/Base-DAQ b/deps/Base-DAQ index f118b02..2b4e8b0 160000 --- a/deps/Base-DAQ +++ b/deps/Base-DAQ @@ -1 +1 @@ -Subproject commit f118b029ff73dc23989c5b648cd6175b968a9a14 +Subproject commit 2b4e8b039ec5da9ddd53720991c1b95f034e86fb diff --git a/src/TCP_Protocol.cpp b/src/TCP_Protocol.cpp index 81cca39..7e32014 100755 --- a/src/TCP_Protocol.cpp +++ b/src/TCP_Protocol.cpp @@ -11,21 +11,14 @@ 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(); @@ -33,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; @@ -101,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) { - std::cerr << "socket failed" << std::endl;; + std::cerr << "socket failed" << std::endl; + ; return -1; } } @@ -112,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) { - std::cerr << "TCP CONNECTION: Bind failed" << std::endl;; + std::cerr << "TCP CONNECTION: Bind failed" << std::endl; + ; srv_sock = -1; return -1; } std::cout << "TCP CONNECTION: Waiting for connection" << std::endl; if (listen(srv_sock, 1) < 0) { - std::cerr << "TCP CONNECTION: Listen error" << std::endl;; + std::cerr << "TCP CONNECTION: Listen error" << std::endl; + ; srv_sock = -1; return -1; } @@ -127,7 +124,8 @@ 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) { - std::cerr << "TCP CONNECTION: accept error" << std::endl;; + std::cerr << "TCP CONNECTION: accept error" << std::endl; + ; srv_sock = -1; return -1; } @@ -140,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) { - std::cerr << "TCP CONNECTION: Socket creation error" << std::endl;; + std::cerr << "TCP CONNECTION: Socket creation error" << std::endl; + ; this->cli_sock = -1; return -1; } @@ -150,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) { - std::cerr << "TCP CONNECTION: Invalid address/ Address not supported" << std::endl;; + 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) { - std::cerr << "TCP CONNECTION: Connection Failed " << std::endl;; + std::cerr << "TCP CONNECTION: Connection Failed " << std::endl; + ; this->cli_sock = -1; return -1; } @@ -187,12 +189,12 @@ 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(); @@ -212,11 +214,17 @@ void P_B::reset() { } P_B* P_B::configFrom(Configurators::BaseConfigurator *conf) { - std::map params = conf->readConfig(); - if (params.count(ip_key) > 0) - protocol->ip = params[ip_key]; + 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[port_key]); + protocol->port = std::stoi(params[key]); return this; } @@ -230,7 +238,7 @@ P_B* P_B::setPort(int port) { return this; } -TCPProtocol * P_B::getProtocol() { +TCPProtocol* P_B::getProtocol() { TCPProtocol *result = this->protocol; this->reset(); return result; -- GitLab