diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e682532af5cf67e49e94f9b71251d14d4509408..b4fef02dd579bc603088a307241fd435836ed3ed 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,6 @@ option(UDPPROTOCOL_BUILD_SHARED "Build udpprotocol as a shared library." OFF) set(SOURCES src/UDP_Protocol.cpp - src/UDP_Protocol_Configurator.cpp ) # target 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/UDP_Protocol.h b/include/UDP_Protocol.h index f4a9d1e33ddfa1ecb2bdcd185542a08d7a2a25c5..6f18e14fc5cecabab7c8e685386931b944a42cfb 100755 --- a/include/UDP_Protocol.h +++ b/include/UDP_Protocol.h @@ -3,10 +3,10 @@ * Created on: Mar 1, 2021 * Author: astrisw */ -#ifndef UDP_PROTOCOL_H_ -#define UDP_PROTOCOL_H_ +#pragma once #include +#include /* * class UDPProtocol @@ -14,30 +14,29 @@ * @member field fd_sock: socket file descriptor * @member field sockaddr_in: struct of the client address. */ -namespace inaf::oasbo::ConnectionProtocols{ +namespace inaf::oasbo::ConnectionProtocols { -class UDPProtocol : public BaseProtocol{ +class UDPProtocol: public BaseProtocol { protected: int srv_sock; int cli_sock; - std::string ip{}; - int port; + struct sockaddr_in cliaddr; struct sockaddr_in srvaddr; - void split_ip_port(const std::string& ip_port, std::string& ip, std::string& port); - int receiveAtLeastHeaderSizeBytes(uint8_t *buff, int headerSize, int packetSize); - void resetPacket(PacketLib::BasePacket &, int bytes); - + void split_ip_port(const std::string &ip_port, std::string &ip, + std::string &port); + int receiveAtLeastHeaderSizeBytes(uint8_t *buff, int headerSize, + int packetSize); + void resetPacket(PacketLib::BasePacket&, int bytes); -public: UDPProtocol(std::string ip, int prt); UDPProtocol(); - ~UDPProtocol(); - std::string getIp(){return ip;} - int getPort(){ return port;} - void setIp(std::string ip){ this->ip = ip;} - void setPort(int port){this->port = port;} +public: + std::string ip { }; + int port; + + ~UDPProtocol(); int connectToServer() override; int connectToClient() override; @@ -45,8 +44,31 @@ public: int closeConnectionToClient() override; bool isConnectedToClient() const override; bool isConnectedToServer() const override; - int receiveFromClient(PacketLib::BasePacket &) override; - int sendToServer(PacketLib::BasePacket &) override; + int receiveFromClient(PacketLib::BasePacket&) override; + int sendToServer(PacketLib::BasePacket&) override; + + friend class Builder; + class Builder { + protected: + UDPProtocol *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); + + UDPProtocol* getProtocol(); + }; + }; } -#endif /* UDP_PROTOCOL_H_ */ diff --git a/src/UDP_Protocol.cpp b/src/UDP_Protocol.cpp index c32df459d2319e1489afcc820a63f88b2df9ccdd..d164cdadfb9716089b9b0b64d4d638b426d041d6 100755 --- a/src/UDP_Protocol.cpp +++ b/src/UDP_Protocol.cpp @@ -9,20 +9,16 @@ #include #include - +#include using namespace inaf::oasbo::ConnectionProtocols; -UDPProtocol::UDPProtocol() { - UDPProtocol(std::string("127.0.0.1"),9003); +UDPProtocol::UDPProtocol() : + UDPProtocol(std::string("127.0.0.1"), 9003) { } -UDPProtocol::UDPProtocol(std::string ip, int port) { - this->host = std::string(ip).append(":").append(std::to_string(port)); - this->ip = ip; - this->port = port; - this->srv_sock = -1; - this->cli_sock = -1; +UDPProtocol::UDPProtocol(std::string ip, int port) : + srv_sock(-1), cli_sock(-1), ip(ip), port(port) { memset(&cliaddr, 0, sizeof(cliaddr)); memset(&srvaddr, 0, sizeof(srvaddr)); // Filling server information @@ -47,11 +43,12 @@ int UDPProtocol::sendToServer(PacketLib::BasePacket &pack) { return val; } -int UDPProtocol::receiveAtLeastHeaderSizeBytes(uint8_t *buff, int headerSize, int packetSize) { +int UDPProtocol::receiveAtLeastHeaderSizeBytes(uint8_t *buff, int headerSize, + int packetSize) { int bytercv = 0; socklen_t len = sizeof(cliaddr); while (bytercv < headerSize) { - int rcv = recvfrom(srv_sock, &buff[bytercv], packetSize+1, // +1 to recognized if there are more bytes than expected + int rcv = recvfrom(srv_sock, &buff[bytercv], packetSize + 1, // +1 to recognized if there are more bytes than expected MSG_WAITFORONE, (struct sockaddr*) &cliaddr, &len); bytercv += rcv; if (rcv < 0) { @@ -61,7 +58,6 @@ int UDPProtocol::receiveAtLeastHeaderSizeBytes(uint8_t *buff, int headerSize, in return bytercv; } - int UDPProtocol::receiveFromClient(PacketLib::BasePacket &pack) { bool headerFlag = false; int headerSize = pack.getHeaderSize(); @@ -70,18 +66,18 @@ int UDPProtocol::receiveFromClient(PacketLib::BasePacket &pack) { uint payloadSize = 0; uint totPacketSize = 0; ssize_t to_be_received = 0; - uint8_t *buff = new uint8_t[(packSize+headerSize)*headerSize]; // to avoid overflow + uint8_t *buff = new uint8_t[(packSize + headerSize) * headerSize]; // to avoid overflow int tot_byte_rcv = 0; - while(true){ - while(!headerFlag){ // until the header has not received - int rcv = receiveAtLeastHeaderSizeBytes(buff,headerSize, packSize); // receive at least headerSize byte, maximum packSize for each udp rcv. - if(rcv == -1){ + while (true) { + while (!headerFlag) { // until the header has not received + int rcv = receiveAtLeastHeaderSizeBytes(buff, headerSize, packSize); // receive at least headerSize byte, maximum packSize for each udp rcv. + if (rcv == -1) { delete buff; return -1; } - tot_byte_rcv+=rcv; + tot_byte_rcv += rcv; pack.copyToBinaryPointer(buff, headerSize); //copy the header into packet to be able to read it. - if(!pack.isRecognizedHeader()){ // reset buffer and exit + if (!pack.isRecognizedHeader()) { // reset buffer and exit resetPacket(pack, headerSize); delete buff; return -1; @@ -92,8 +88,9 @@ int UDPProtocol::receiveFromClient(PacketLib::BasePacket &pack) { to_be_received = totPacketSize - tot_byte_rcv; // Calculate how much is still left to read } - if (to_be_received == 0){ // whole packet has been received. - pack.copyToBinaryPointer(&buff[headerSize],tot_byte_rcv-headerSize, headerSize); // copy the buffer into packet except already copied header + if (to_be_received == 0) { // whole packet has been received. + pack.copyToBinaryPointer(&buff[headerSize], + tot_byte_rcv - headerSize, headerSize); // copy the buffer into packet except already copied header delete buff; return tot_byte_rcv; } @@ -102,30 +99,29 @@ int UDPProtocol::receiveFromClient(PacketLib::BasePacket &pack) { delete buff; return -1; } - uint8_t *tmp_buff = new uint8_t[packSize+headerSize]; // maximum receivable in receiveAtLeastHeaderSizeBytes + uint8_t *tmp_buff = new uint8_t[packSize + headerSize]; // maximum receivable in receiveAtLeastHeaderSizeBytes int rcv = receiveAtLeastHeaderSizeBytes(tmp_buff, headerSize, packSize); - if(rcv == -1){ + if (rcv == -1) { delete buff; delete tmp_buff; resetPacket(pack, tot_byte_rcv); return -1; } - std::vector vec; - std::copy(tmp_buff, tmp_buff + headerSize, std::back_inserter(vec)); - if(pack.isRecognizedHeader(vec)){ //another header received, save it and discard previous data. - std::memset(buff,0,tot_byte_rcv); + std::vector vec; + std::copy(tmp_buff, tmp_buff + headerSize, std::back_inserter(vec)); + if (pack.isRecognizedHeader(vec)) { //another header received, save it and discard previous data. + std::memset(buff, 0, tot_byte_rcv); std::memcpy(buff, tmp_buff, rcv); headerFlag = true; pack.copyToBinaryPointer(buff, headerSize); payloadSize = pack.getPayloadSize(); totPacketSize = headerSize + payloadSize + tailSize; to_be_received = totPacketSize - rcv; - tot_byte_rcv=rcv; - } - else{ // append to current buff - tot_byte_rcv+=rcv; - std::memcpy(&buff[tot_byte_rcv-rcv], tmp_buff, rcv); - to_be_received-=rcv; + tot_byte_rcv = rcv; + } else { // append to current buff + tot_byte_rcv += rcv; + std::memcpy(&buff[tot_byte_rcv - rcv], tmp_buff, rcv); + to_be_received -= rcv; } delete tmp_buff; } @@ -136,7 +132,7 @@ int UDPProtocol::connectToClient() { // Creating socket file descriptor if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - perror("socket creation failed"); + std::cerr << "UDP Connection: socket creation failed" << std::endl; return -1; } @@ -148,7 +144,7 @@ int UDPProtocol::connectToClient() { // Bind the socket with the server address if (bind(sockfd, (const struct sockaddr*) &srvaddr, sizeof(srvaddr)) < 0) { - perror("bind failed"); + std::cerr << "UDP Connection: bind failed" << std::endl; return -1; } @@ -160,11 +156,12 @@ int UDPProtocol::connectToServer() { int sockfd = 0; // Creating socket file descriptor if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - perror("socket creation failed"); + std::cerr << "UDP Connection: socket creation failed " << std::endl; exit(EXIT_FAILURE); } - printf("Connection made\n"); + std::cout << "UDP Connection: socket creation success " << std::endl; + this->cli_sock = sockfd; return sockfd; @@ -195,7 +192,8 @@ bool UDPProtocol::isConnectedToServer() const { void UDPProtocol::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; } @@ -216,3 +214,50 @@ void UDPProtocol::split_ip_port(const std::string &ip_port, ip_address = ip_port.substr(0, colon_pos); port = ip_port.substr(colon_pos + 1); } + +using U_B = UDPProtocol::Builder; +U_B::Builder() { + this->reset(); +} +U_B::Builder(std::string ip, int port) { + this->protocol = new UDPProtocol(ip, port); + +} +U_B::~Builder() { + delete protocol; +} + +void U_B::reset() { + this->protocol = new UDPProtocol(); +} + +U_B* U_B::configFrom(Configurators::BaseConfigurator *conf) { + std::string target = std::string("UDPProtocol"); + 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(key) > 0) + protocol->port = std::stoi(params[key]); + return this; +} + +U_B* U_B::setIp(std::string ip) { + protocol->ip = ip; + return this; +} + +U_B* U_B::setPort(int port) { + protocol->port = port; + return this; +} + +UDPProtocol* U_B::getProtocol() { + UDPProtocol *result = this->protocol; + this->reset(); + return result; +}