diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index b83b73cfe..d3f6851cb 100755 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -126,7 +126,7 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { void validate(T arg, T retval, std::string modename, numberMode hex); /** Unrecognized Function */ - int M_nofunc(); + int M_nofunc(sls::DataSocket & socket); @@ -386,6 +386,8 @@ protected: /** Socket */ MySocketTCP* mySock; + std::unique_ptr server{nullptr}; + /** client interface */ ServerInterface* interface; }; diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 021cb1f36..7446dd801 100755 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -55,13 +55,13 @@ slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int pn): // create socket portNumber = (pn > 0 ? pn : DEFAULT_PORTNO + 2); - MySocketTCP* m = new MySocketTCP(portNumber); - mySock = m; - interface = new ServerInterface(mySock, -1, "Receiver"); + // MySocketTCP* m = new MySocketTCP(portNumber); + // mySock = m; + // interface = new ServerInterface(mySock, -1, "Receiver"); //initialize variables - strcpy(mySock->lastClientIP,"none"); - strcpy(mySock->thisClientIP,"none1"); + // strcpy(mySock->lastClientIP,"none"); + // strcpy(mySock->thisClientIP,"none1"); memset(mess,0,sizeof(mess)); strcpy(mess,"dummy message"); @@ -86,7 +86,9 @@ void slsReceiverTCPIPInterface::stop(){ if (tcpThreadCreated) { FILE_LOG(logINFO) << "Shutting down TCP Socket on port " << portNumber; killTCPServerThread = 1; - if(mySock) mySock->ShutDownSocket(); + // if(mySock) mySock->ShutDownSocket(); + if(server) + server->shutDownSocket(); FILE_LOG(logDEBUG) << "TCP Socket closed on port " << portNumber; pthread_join(TCPServer_thread, nullptr); tcpThreadCreated = false; @@ -131,49 +133,56 @@ void* slsReceiverTCPIPInterface::startTCPServerThread(void *this_pointer){ return this_pointer; } +void slsReceiverTCPIPInterface::startTCPServer() { + 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; -void slsReceiverTCPIPInterface::startTCPServer(){ - 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) { - while(true) { - auto server = sls::ServerSocket(portNumber); - auto socket = server.accept(); - ret = decode_function(socket); - // if(mySock->Connect() >= 0){ - // ret = decode_function(); - // mySock->Disconnect(); - // } + try { + auto socket = server->accept(); + ret = decode_function(socket); + // if(mySock->Connect() >= 0){ + // ret = decode_function(); + // mySock->Disconnect(); + // } - //if tcp command was to exit server - if(ret == GOODBYE){ - FILE_LOG(logINFO) << "Shutting down UDP Socket"; - if(receiver){ - receiver->shutDownUDPSockets(); - } + // if tcp command was to exit server + if (ret == GOODBYE) { + FILE_LOG(logINFO) << "Shutting down UDP Socket"; + if (receiver) { + receiver->shutDownUDPSockets(); + } - mySock->exitServer(); - FILE_LOG(logINFOBLUE) << "Exiting [ TCP server Tid: " << syscall(SYS_gettid) <<"]"; - pthread_exit(nullptr); + mySock->exitServer(); + FILE_LOG(logINFOBLUE) + << "Exiting [ TCP server Tid: " << syscall(SYS_gettid) + << "]"; + pthread_exit(nullptr); + } + }catch(const sls::SocketError& e){ + std::cout << "Accept failed\n"; } - //if user entered exit - if(killTCPServerThread) { - if (ret != GOODBYE) { - if(receiver){ - receiver->shutDownUDPSockets(); - } - } - FILE_LOG(logINFOBLUE) << "Exiting [ TCP server Tid: " << syscall(SYS_gettid) <<"]"; - pthread_exit(nullptr); - } - } + // if user entered exit + if (killTCPServerThread) { + if (ret != GOODBYE) { + if (receiver) { + receiver->shutDownUDPSockets(); + } + } + FILE_LOG(logINFOBLUE) + << "Exiting [ TCP server Tid: " << syscall(SYS_gettid) << "]"; + pthread_exit(nullptr); + } + } } - - - int slsReceiverTCPIPInterface::function_table(){ flist[F_EXEC_RECEIVER_COMMAND] = &slsReceiverTCPIPInterface::exec_command; flist[F_EXIT_RECEIVER] = &slsReceiverTCPIPInterface::exit_server; @@ -257,7 +266,7 @@ int slsReceiverTCPIPInterface::decode_function(sls::DataSocket &socket){ if (fnum <= NUM_DET_FUNCTIONS || fnum >= NUM_REC_FUNCTIONS) { FILE_LOG(logERROR) << "Unknown function enum " << fnum; - ret = (this->M_nofunc)(); + ret = (this->M_nofunc)(socket); } else{ FILE_LOG(logDEBUG1) << "calling function fnum: "<< fnum << " " "(" << getFunctionNameFromEnum((enum detFuncs)fnum) << ") " @@ -301,18 +310,23 @@ void slsReceiverTCPIPInterface::validate(T arg, T retval, std::string modename, } } -int slsReceiverTCPIPInterface::M_nofunc(){ +int slsReceiverTCPIPInterface::M_nofunc(sls::DataSocket &socket){ ret = FAIL; memset(mess, 0, sizeof(mess)); // to receive any arguments + + socket.setReceiveTimeout(500); int n = 1; while (n > 0) - n = mySock->ReceiveDataOnly(mess, MAX_STR_LENGTH); + n = socket.read(mess, MAX_STR_LENGTH); sprintf(mess,"Unrecognized Function enum %d. Please do not proceed.\n", fnum); FILE_LOG(logERROR) << mess; - return interface->Server_SendResult(false, ret, nullptr, 0, mess); + socket.sendData(&ret, sizeof(ret)); + socket.sendData(mess, sizeof(mess)); + return 0; + // return interface->Server_SendResult(false, ret, nullptr, 0, mess); } diff --git a/slsSupportLib/include/DataSocket.h b/slsSupportLib/include/DataSocket.h index a4ad27fe1..a9e7dcc6e 100755 --- a/slsSupportLib/include/DataSocket.h +++ b/slsSupportLib/include/DataSocket.h @@ -20,7 +20,9 @@ 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); int setTimeOut(int t_seconds); + int setReceiveTimeout(int us); void close(); void shutDownSocket(); diff --git a/slsSupportLib/include/logger.h b/slsSupportLib/include/logger.h index 8de0c2f49..541da95b0 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 1af3db89f..3da9cbf75 100755 --- a/slsSupportLib/src/DataSocket.cpp +++ b/slsSupportLib/src/DataSocket.cpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace sls { @@ -43,12 +44,25 @@ size_t DataSocket::receiveData(void *buffer, size_t size) { size_t dataRead = 0; while (dataRead < size) { dataRead += - read(getSocketId(), reinterpret_cast(buffer) + dataRead, + ::read(getSocketId(), reinterpret_cast(buffer) + dataRead, size - dataRead); } return dataRead; } +size_t DataSocket::read(void *buffer, size_t size){ + return ::read(getSocketId(), reinterpret_cast(buffer), size); +} + +int DataSocket::setReceiveTimeout(int us) { + timeval t{}; + t.tv_sec = 0; + t.tv_usec = us; + return ::setsockopt(getSocketId(), SOL_SOCKET, SO_RCVTIMEO, &t, + sizeof(struct timeval)); +} + + size_t DataSocket::sendData(const void *buffer, size_t size) { size_t dataSent = 0; while (dataSent < size) { diff --git a/slsSupportLib/src/ServerSocket.cpp b/slsSupportLib/src/ServerSocket.cpp index 0876c212c..7f07b49fc 100755 --- a/slsSupportLib/src/ServerSocket.cpp +++ b/slsSupportLib/src/ServerSocket.cpp @@ -27,7 +27,7 @@ ServerSocket::ServerSocket(int port) if (bind(getSocketId(), (struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 0) { close(); - throw std::runtime_error("Server ERROR: cannot bind socket"); + throw sls::SocketError("Server ERROR: cannot bind socket"); } if (listen(getSocketId(), DEFAULT_BACKLOG) != 0) { close(); @@ -41,7 +41,7 @@ DataSocket ServerSocket::accept() { int newSocket = ::accept(getSocketId(), (struct sockaddr *)&clientAddr, &addr_size); if (newSocket == -1) { - throw std::runtime_error("Server ERROR: socket accept failed\n"); + throw sls::SocketError("Server ERROR: socket accept failed\n"); } inet_ntop(AF_INET, &(clientAddr.sin_addr), &thisClient_.front(), INET_ADDRSTRLEN);