From c6651df1b2724d0509443b4d74f36cbcb2dbde3d Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 16 May 2019 11:14:03 +0200 Subject: [PATCH] remove mySock --- slsDetectorSoftware/src/slsDetector.cpp | 8 +- .../include/slsReceiverTCPIPInterface.h | 34 ++- .../src/slsReceiverTCPIPInterface.cpp | 219 ++++++------------ slsSupportLib/include/DataSocket.h | 2 +- slsSupportLib/include/ServerSocket.h | 2 +- slsSupportLib/include/logger.h | 4 +- slsSupportLib/src/DataSocket.cpp | 2 +- 7 files changed, 91 insertions(+), 180 deletions(-) diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index d505b3eba..b904dc26a 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -3220,10 +3220,10 @@ int slsDetector::setReceiverOnline(int value) { } else { shm()->rxOnlineFlag = OFFLINE_FLAG; if (value == ONLINE_FLAG) { - // connect and set offline flag - auto receiver = - ReceiverSocket(shm()->rxHostname, shm()->rxTCPPort); - receiver.close(); + // Connect and ask for receiver id to verify that + // it's online and working + int64_t retval{0}; + sendToReceiver(F_GET_RECEIVER_ID, nullptr, retval); shm()->rxOnlineFlag = ONLINE_FLAG; if (shm()->receiverAPIVersion == 0) { checkReceiverVersionCompatibility(); diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index 292b74bbd..37fdc7c75 100755 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -299,6 +299,9 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { int set_dbit_offset(sls::ServerInterface2 &socket); + int LogSocketCrash(); + void NullObjectError(int& ret, char* mess); + /** detector type */ detectorType myDetectorType; @@ -309,25 +312,25 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { int (slsReceiverTCPIPInterface::*flist[NUM_REC_FUNCTIONS])(sls::ServerInterface2& socket); /** Message */ - char mess[MAX_STR_LENGTH]; + char mess[MAX_STR_LENGTH]{"dummy message"}; /** success/failure */ - int ret; + int ret{OK}; /** function index */ - int fnum; + int fnum{-1}; /** Lock Status if server locked to a client */ - int lockStatus; + int lockStatus{0}; /** kill tcp server thread */ - int killTCPServerThread; + int killTCPServerThread{0}; /** thread for TCP server */ pthread_t TCPServer_thread; /** tcp thread created flag*/ - bool tcpThreadCreated; + bool tcpThreadCreated{false}; /** port number */ int portNumber; @@ -345,16 +348,16 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { * we write depending on file write enable * users get data to write depending on call backs registered */ - int (*startAcquisitionCallBack)(char*, char*, uint64_t, uint32_t, void*); - void *pStartAcquisition; + int (*startAcquisitionCallBack)(char*, char*, uint64_t, uint32_t, void*) = nullptr; + void *pStartAcquisition{nullptr}; /** * Call back for acquisition finished * callback argument is * total frames caught */ - void (*acquisitionFinishedCallBack)(uint64_t, void*); - void *pAcquisitionFinished; + void (*acquisitionFinishedCallBack)(uint64_t, void*) = nullptr; + void *pAcquisitionFinished{nullptr}; /** @@ -365,7 +368,7 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { * dataSize in bytes is the size of the data in bytes. */ void (*rawDataReadyCallBack)(char* , - char*, uint32_t, void*); + char*, uint32_t, void*) = nullptr; /** * Call back for raw data (modified) @@ -375,22 +378,17 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { * revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). */ void (*rawDataModifyReadyCallBack)(char* , - char*, uint32_t &, void*); + char*, uint32_t &, void*) = nullptr; - void *pRawDataReady; + void *pRawDataReady{nullptr}; protected: - /** Socket */ - MySocketTCP* mySock; std::unique_ptr server{nullptr}; - /** client interface */ - ServerInterface* interface; - private: int VerifyLock(int &ret, char *mess); int VerifyLockAndIdle(int &ret, char *mess, int fnum); diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index b620fb094..bc55f67b3 100755 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -5,7 +5,6 @@ #include "FixedCapacityContainer.h" -#include "MySocketTCP.h" #include "ServerSocket.h" #include "ServerInterface.h" #include "slsReceiver.h" @@ -13,6 +12,7 @@ #include "slsReceiverTCPIPInterface.h" #include "slsReceiverUsers.h" #include "versionAPI.h" +#include "string_utils.h" #include #include @@ -26,45 +26,12 @@ slsReceiverTCPIPInterface::~slsReceiverTCPIPInterface() { stop(); - delete mySock; - mySock=nullptr; - delete interface; - delete receiver; } slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int pn): myDetectorType(GOTTHARD), - receiver(nullptr), - ret(OK), - fnum(-1), - lockStatus(0), - killTCPServerThread(0), - tcpThreadCreated(false), - portNumber(DEFAULT_PORTNO+2), - mySock(nullptr), - interface(nullptr) + portNumber(pn > 0 ? pn : DEFAULT_PORTNO + 2) { - //***callback parameters*** - startAcquisitionCallBack = nullptr; - pStartAcquisition = nullptr; - acquisitionFinishedCallBack = nullptr; - pAcquisitionFinished = nullptr; - rawDataReadyCallBack = nullptr; - rawDataModifyReadyCallBack = nullptr; - pRawDataReady = nullptr; - - // create socket - portNumber = (pn > 0 ? pn : DEFAULT_PORTNO + 2); - // MySocketTCP* m = new MySocketTCP(portNumber); - // mySock = m; - // interface = new ServerInterface(mySock, -1, "Receiver"); - - //initialize variables - // strcpy(mySock->lastClientIP,"none"); - // strcpy(mySock->thisClientIP,"none1"); - memset(mess,0,sizeof(mess)); - strcpy(mess,"dummy message"); - function_table(); } @@ -86,7 +53,6 @@ void slsReceiverTCPIPInterface::stop(){ if (tcpThreadCreated) { FILE_LOG(logINFO) << "Shutting down TCP Socket on port " << portNumber; killTCPServerThread = 1; - // if(mySock) mySock->ShutDownSocket(); if(server) server->shutDownSocket(); FILE_LOG(logDEBUG) << "TCP Socket closed on port " << portNumber; @@ -134,30 +100,17 @@ void* slsReceiverTCPIPInterface::startTCPServerThread(void *this_pointer){ } void slsReceiverTCPIPInterface::startTCPServer() { - FILE_LOG(logINFOBLUE) << "Created [ TCP server Tid: " << syscall(SYS_gettid) - << "]"; - ; + FILE_LOG(logINFOBLUE) << "Created [ TCP server Tid: " + << syscall(SYS_gettid) << "]"; FILE_LOG(logINFO) << "SLS Receiver starting TCP Server on port " << portNumber << std::endl; int ret = OK; - server = sls::make_unique(portNumber); while (true) { - try { - std::cout << "<--------- hej\n"; auto socket = server->accept(); - std::cout << "<--------- hej2\n"; - socket.setTimeOut(1); - socket.setReceiveTimeout(1000); - std::cout << "<--------- hej3\n"; + socket.setReceiveTimeout(10000); ret = decode_function(socket); - std::cout << "<--------- hej4\n"; - socket.close(); - // if(mySock->Connect() >= 0){ - // ret = decode_function(); - // mySock->Disconnect(); - // } // if tcp command was to exit server if (ret == GOODBYE) { @@ -165,8 +118,6 @@ void slsReceiverTCPIPInterface::startTCPServer() { if (receiver) { receiver->shutDownUDPSockets(); } - - mySock->exitServer(); FILE_LOG(logINFOBLUE) << "Exiting [ TCP server Tid: " << syscall(SYS_gettid) << "]"; @@ -254,43 +205,38 @@ int slsReceiverTCPIPInterface::function_table(){ return OK; } - - - -int slsReceiverTCPIPInterface::decode_function(sls::ServerInterface2 &socket){ - ret = FAIL; - std::cout << "<------ decode 1\n"; - int n = socket.read(&fnum, sizeof(fnum)); - std::cout << "<------ decode 2\n"; - if (n <= 0) { - FILE_LOG(logDEBUG3) << "Could not read socket. " - "Received " << n << " bytes," << - "fnum:" << fnum << " " - "(" << getFunctionNameFromEnum((enum detFuncs)fnum) << ")"; - return FAIL; - } - else - FILE_LOG(logDEBUG3) << "Received " << n << " bytes"; - - if (fnum <= NUM_DET_FUNCTIONS || fnum >= NUM_REC_FUNCTIONS) { - FILE_LOG(logERROR) << "Unknown function enum " << fnum; - ret = (this->M_nofunc)(socket); - } else{ - FILE_LOG(logDEBUG1) << "calling function fnum: "<< fnum << " " - "(" << getFunctionNameFromEnum((enum detFuncs)fnum) << ") " - "located at " << flist[fnum]; - ret = (this->*flist[fnum])(socket); - - if (ret == FAIL) { - FILE_LOG(logDEBUG1) << "Failed to execute function = " << fnum << " (" - << getFunctionNameFromEnum((enum detFuncs)fnum) << ")"; - } else FILE_LOG(logDEBUG1) << "Function " << - getFunctionNameFromEnum((enum detFuncs)fnum) << " executed OK"; - } - return ret; +int slsReceiverTCPIPInterface::decode_function(sls::ServerInterface2 &socket) { + ret = FAIL; + int n = socket.read(&fnum, sizeof(fnum)); + if (n <= 0) { + FILE_LOG(logDEBUG3) + << "Could not read socket. Received " << n + << " bytes, fnum:" << fnum << " (" + << getFunctionNameFromEnum((enum detFuncs)fnum) << ")"; + return FAIL; + } else { + FILE_LOG(logDEBUG3) << "Received " << n << " bytes"; + } + if (fnum <= NUM_DET_FUNCTIONS || fnum >= NUM_REC_FUNCTIONS) { + FILE_LOG(logERROR) << "Unknown function enum " << fnum; + ret = (this->M_nofunc)(socket); + } else { + FILE_LOG(logDEBUG1) << "calling function fnum: " << fnum << " (" + << getFunctionNameFromEnum((enum detFuncs)fnum) + << ") located at " << flist[fnum]; + ret = (this->*flist[fnum])(socket); + if (ret == FAIL) { + FILE_LOG(logDEBUG1) + << "Failed to execute function = " << fnum << " (" + << getFunctionNameFromEnum((enum detFuncs)fnum) << ")"; + } else + FILE_LOG(logDEBUG1) + << "Function " << getFunctionNameFromEnum((enum detFuncs)fnum) + << " executed OK"; + } + return ret; } - void slsReceiverTCPIPInterface::functionNotImplemented() { ret = FAIL; sprintf(mess, "Function (%s) is not implemented for this detector\n", @@ -322,9 +268,6 @@ int slsReceiverTCPIPInterface::M_nofunc(sls::ServerInterface2 &socket){ ret = FAIL; memset(mess, 0, sizeof(mess)); - // to receive any arguments - - socket.setReceiveTimeout(500); int n = 1; while (n > 0) n = socket.read(mess, MAX_STR_LENGTH); @@ -428,8 +371,9 @@ int slsReceiverTCPIPInterface::lock_receiver(sls::ServerInterface2 &socket) { int slsReceiverTCPIPInterface::get_last_client_ip(sls::ServerInterface2 &socket) { ret = OK; memset(mess, 0, sizeof(mess)); - auto ip = server->getLastClient().str(); - return socket.sendResult(true, ret, &ip.front(), ip.length()+1, nullptr); + char ip[INET_ADDRSTRLEN]{}; + sls::strcpy_safe(ip, server->getLastClient().str().c_str()); + return socket.sendResult(true, ret, &ip, sizeof(ip)); } @@ -438,30 +382,23 @@ int slsReceiverTCPIPInterface::set_port(sls::ServerInterface2 &socket) { ret = OK; memset(mess, 0, sizeof(mess)); int p_number = -1; - MySocketTCP* mySocket = nullptr; - char oldLastClientIP[INET_ADDRSTRLEN] = {0}; - - // get args, return if socket crashed if (socket.receiveArg(ret, mess, &p_number, sizeof(p_number)) == FAIL) return FAIL; - // verify if receiver is unlocked if (VerifyLock(ret, mess) == OK) { - // port number too low if (p_number < 1024) { ret = FAIL; sprintf(mess,"Port Number (%d) too low\n", p_number); FILE_LOG(logERROR) << mess; } else { FILE_LOG(logINFO) << "set port to " << p_number <lastClientIP); - // create new socket try { - mySocket = new MySocketTCP(p_number); - strcpy(mySock->lastClientIP,oldLastClientIP); + auto new_server = sls::make_unique(p_number); + new_server->setLockedBy(server->getLockedBy()); + new_server->setLastClient(server->getLastClient()); + server = std::move(new_server); } catch(SocketError &e) { ret = FAIL; - // same socket, could not bind port sprintf(mess, "%s", e.what()); FILE_LOG(logERROR) << mess; } catch (...) { @@ -473,13 +410,6 @@ int slsReceiverTCPIPInterface::set_port(sls::ServerInterface2 &socket) { } socket.sendResult(true, ret, &p_number,sizeof(p_number), mess); - // delete old socket - if(ret != FAIL){ - mySock->Disconnect(); - delete mySock; - mySock = mySocket; - interface->SetSocket(mySock); - } return ret; } @@ -505,10 +435,11 @@ int slsReceiverTCPIPInterface::update_client(sls::ServerInterface2 &socket) { int slsReceiverTCPIPInterface::send_update(sls::ServerInterface2 &socket) { int n = 0; int i32 = -1; - char cstring[MAX_STR_LENGTH] = {0}; + char cstring[MAX_STR_LENGTH]{}; - - n += socket.sendData(mySock->lastClientIP,sizeof(mySock->lastClientIP)); + char ip[INET_ADDRSTRLEN]{}; + sls::strcpy_safe(ip, server->getLastClient().str().c_str()); + n += socket.sendData(ip,sizeof(ip)); // filepath strcpy(cstring, receiver->getFilePath().c_str()); @@ -600,9 +531,6 @@ int slsReceiverTCPIPInterface::send_update(sls::ServerInterface2 &socket) { i32=receiver->getDbitOffset(); n += socket.sendData(&i32, sizeof(i32)); - // if (!lockStatus) - // strcpy(mySock->lastClientIP, mySock->thisClientIP); - return OK; } @@ -668,10 +596,6 @@ int slsReceiverTCPIPInterface::set_detector_type(sls::ServerInterface2 &socket){ receiver->registerCallBackRawDataReady(rawDataReadyCallBack,pRawDataReady); if(rawDataModifyReadyCallBack) receiver->registerCallBackRawDataModifyReady(rawDataModifyReadyCallBack,pRawDataReady); - - // // client has started updating receiver, update ip - // if (!lockStatus) - // strcpy(mySock->lastClientIP, mySock->thisClientIP); } } @@ -715,27 +639,30 @@ int slsReceiverTCPIPInterface::set_detector_hostname(sls::ServerInterface2 &sock return socket.sendResult(true, ret, retval, MAX_STR_LENGTH, mess); } +int slsReceiverTCPIPInterface::LogSocketCrash(){ + FILE_LOG(logERROR) << "Reading from socket failed. Possible socket crash"; + return FAIL; +} + +void slsReceiverTCPIPInterface::NullObjectError(int& ret, char* mess){ + ret=FAIL; + strcpy(mess,"Receiver not set up. Please use rx_hostname first.\n"); + FILE_LOG(logERROR) << mess; +} + int slsReceiverTCPIPInterface::set_roi(sls::ServerInterface2 &socket) { ret = OK; memset(mess, 0, sizeof(mess)); + static_assert(sizeof(ROI) == 4*sizeof(int), "ROI not packed"); int narg = -1; - std::vector arg; + socket.read(&narg,sizeof(narg)); - // receive arguments - if (mySock->ReceiveDataOnly(&narg,sizeof(narg)) < 0 ) - return interface->Server_SocketCrash(); + std::vector arg; for (int iloop = 0; iloop < narg; ++iloop) { - ROI temp; - if ( mySock->ReceiveDataOnly(&temp.xmin, sizeof(int)) < 0 ) - return interface->Server_SocketCrash(); - if ( mySock->ReceiveDataOnly(&temp.xmax, sizeof(int)) < 0 ) - return interface->Server_SocketCrash(); - if ( mySock->ReceiveDataOnly(&temp.ymin, sizeof(int)) < 0 ) - return interface->Server_SocketCrash(); - if ( mySock->ReceiveDataOnly(&temp.ymax, sizeof(int)) < 0 ) - return interface->Server_SocketCrash(); + ROI temp{}; + socket.read(&temp, sizeof(temp)); arg.push_back(temp); } FILE_LOG(logDEBUG1) << "Set ROI narg: " << narg; @@ -750,14 +677,11 @@ int slsReceiverTCPIPInterface::set_roi(sls::ServerInterface2 &socket) { // base object not null else if (receiver == nullptr) - interface->Server_NullObjectError(ret, mess); + NullObjectError(ret, mess); else { - // only set - // verify if receiver is unlocked and idle if (VerifyLockAndIdle(ret, mess, fnum) == OK) ret = receiver->setROI(arg); } - arg.clear(); return socket.sendResult(true, ret, nullptr, 0, mess); } @@ -766,8 +690,8 @@ int slsReceiverTCPIPInterface::set_roi(sls::ServerInterface2 &socket) { int slsReceiverTCPIPInterface::setup_udp(sls::ServerInterface2 &socket){ ret = OK; memset(mess, 0, sizeof(mess)); - char args[6][MAX_STR_LENGTH] = {{""}, {""}, {""}, {""}, {""}, {""}}; - char retvals[2][MAX_STR_LENGTH] = {{""}, {""}}; + char args[6][MAX_STR_LENGTH]{}; + char retvals[2][MAX_STR_LENGTH]{}; // get args, return if socket crashed, ret is fail if receiver is not null if (socket.receiveArg(ret, mess, args, sizeof(args)) == FAIL) @@ -2094,7 +2018,6 @@ int slsReceiverTCPIPInterface::set_deactivated_padding_enable(sls::ServerInterfa else if (ret == OK) { // set if (enable >= 0) { - // verify if receiver is unlocked and idle if (VerifyLockAndIdle(ret, mess, fnum) == OK) { FILE_LOG(logDEBUG1) << "Setting deactivated padding enable: " << enable; receiver->setDeactivatedPadding(enable > 0 ? true : false); @@ -2154,14 +2077,10 @@ int slsReceiverTCPIPInterface::set_adc_mask(sls::ServerInterface2 &socket) { // base object not null else if (ret == OK) { - // set - // verify if receiver is unlocked and idle if (VerifyLockAndIdle(ret, mess, fnum) == OK) { FILE_LOG(logDEBUG1) << "Setting ADC enable mask: " << arg; receiver->setADCEnableMask(arg); } - - // get retval = receiver->getADCEnableMask(); if (ret == OK && retval != arg) { ret = FAIL; @@ -2185,7 +2104,7 @@ int slsReceiverTCPIPInterface::set_dbit_list(sls::ServerInterface2 &socket) { FILE_LOG(logDEBUG1) << it << " "; } FILE_LOG(logDEBUG1) << "\n"; - if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { + if (VerifyLockAndIdle(ret, mess, fnum) == OK) { if (args.size() > 64) { ret = FAIL; sprintf(mess, "Could not set dbit list as size is > 64\n"); @@ -2193,8 +2112,6 @@ int slsReceiverTCPIPInterface::set_dbit_list(sls::ServerInterface2 &socket) { } else receiver->setDbitList(args); } - - } return socket.sendResult(true, ret, nullptr, 0, mess); } @@ -2209,7 +2126,6 @@ int slsReceiverTCPIPInterface::get_dbit_list(sls::ServerInterface2 &socket) { // base object not null if (ret == OK) { - // get retval = receiver->getDbitList(); FILE_LOG(logDEBUG1) << "Dbit list size retval:" << retval.size(); } @@ -2229,15 +2145,12 @@ int slsReceiverTCPIPInterface::set_dbit_offset(sls::ServerInterface2 &socket) { // base object not null else if (ret == OK) { - // set if (arg >= 0) { - // verify if receiver is unlocked and idle if (VerifyLockAndIdle(ret, mess, fnum) == OK) { FILE_LOG(logDEBUG1) << "Setting Dbit offset: " << arg; receiver->setDbitOffset(arg); } } - // get retval = receiver->getDbitOffset(); validate(arg, retval, std::string("set dbit offset"), DEC); FILE_LOG(logDEBUG1) << "Dbit offset retval: " << retval; diff --git a/slsSupportLib/include/DataSocket.h b/slsSupportLib/include/DataSocket.h index a9e7dcc6e..87de7d39d 100755 --- a/slsSupportLib/include/DataSocket.h +++ b/slsSupportLib/include/DataSocket.h @@ -20,7 +20,7 @@ class DataSocket { } size_t sendData(const void *buffer, size_t size); size_t receiveData(void *buffer, size_t size); - size_t read(void *buffer, size_t size); + ssize_t read(void *buffer, size_t size); int setTimeOut(int t_seconds); int setReceiveTimeout(int us); void close(); diff --git a/slsSupportLib/include/ServerSocket.h b/slsSupportLib/include/ServerSocket.h index 45abf942b..505eb3568 100755 --- a/slsSupportLib/include/ServerSocket.h +++ b/slsSupportLib/include/ServerSocket.h @@ -19,6 +19,7 @@ class ServerSocket : public DataSocket { constexpr IpAddr getThisClient() noexcept { return thisClient; } constexpr IpAddr getLockedBy() noexcept { return lockedBy; } void setLockedBy(IpAddr addr){ lockedBy = addr; } + void setLastClient(IpAddr addr){ lastClient = addr; } int getPort() const; void SendResult(int &ret, void *retval, int retvalSize, char *mess); @@ -27,7 +28,6 @@ class ServerSocket : public DataSocket { IpAddr lastClient; IpAddr lockedBy; int serverPort; - // char lastClient_[INET_ADDRSTRLEN]{}; }; }; // namespace sls \ No newline at end of file diff --git a/slsSupportLib/include/logger.h b/slsSupportLib/include/logger.h index 541da95b0..8de0c2f49 100755 --- a/slsSupportLib/include/logger.h +++ b/slsSupportLib/include/logger.h @@ -17,8 +17,8 @@ #endif #ifndef FILELOG_MAX_LEVEL -// #define FILELOG_MAX_LEVEL logINFO -#define FILELOG_MAX_LEVEL logDEBUG5 +#define FILELOG_MAX_LEVEL logINFO +// #define FILELOG_MAX_LEVEL logDEBUG5 #endif diff --git a/slsSupportLib/src/DataSocket.cpp b/slsSupportLib/src/DataSocket.cpp index 3da9cbf75..9a70c5c19 100755 --- a/slsSupportLib/src/DataSocket.cpp +++ b/slsSupportLib/src/DataSocket.cpp @@ -50,7 +50,7 @@ size_t DataSocket::receiveData(void *buffer, size_t size) { return dataRead; } -size_t DataSocket::read(void *buffer, size_t size){ +ssize_t DataSocket::read(void *buffer, size_t size){ return ::read(getSocketId(), reinterpret_cast(buffer), size); }