try for accept

This commit is contained in:
Erik Frojdh 2019-05-15 12:17:32 +02:00
parent c632badb55
commit 40c2d9f760
6 changed files with 83 additions and 51 deletions

View File

@ -126,7 +126,7 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs {
void validate(T arg, T retval, std::string modename, numberMode hex); void validate(T arg, T retval, std::string modename, numberMode hex);
/** Unrecognized Function */ /** Unrecognized Function */
int M_nofunc(); int M_nofunc(sls::DataSocket & socket);
@ -386,6 +386,8 @@ protected:
/** Socket */ /** Socket */
MySocketTCP* mySock; MySocketTCP* mySock;
std::unique_ptr<sls::ServerSocket> server{nullptr};
/** client interface */ /** client interface */
ServerInterface* interface; ServerInterface* interface;
}; };

View File

@ -55,13 +55,13 @@ slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int pn):
// create socket // create socket
portNumber = (pn > 0 ? pn : DEFAULT_PORTNO + 2); portNumber = (pn > 0 ? pn : DEFAULT_PORTNO + 2);
MySocketTCP* m = new MySocketTCP(portNumber); // MySocketTCP* m = new MySocketTCP(portNumber);
mySock = m; // mySock = m;
interface = new ServerInterface(mySock, -1, "Receiver"); // interface = new ServerInterface(mySock, -1, "Receiver");
//initialize variables //initialize variables
strcpy(mySock->lastClientIP,"none"); // strcpy(mySock->lastClientIP,"none");
strcpy(mySock->thisClientIP,"none1"); // strcpy(mySock->thisClientIP,"none1");
memset(mess,0,sizeof(mess)); memset(mess,0,sizeof(mess));
strcpy(mess,"dummy message"); strcpy(mess,"dummy message");
@ -86,7 +86,9 @@ void slsReceiverTCPIPInterface::stop(){
if (tcpThreadCreated) { if (tcpThreadCreated) {
FILE_LOG(logINFO) << "Shutting down TCP Socket on port " << portNumber; FILE_LOG(logINFO) << "Shutting down TCP Socket on port " << portNumber;
killTCPServerThread = 1; killTCPServerThread = 1;
if(mySock) mySock->ShutDownSocket(); // if(mySock) mySock->ShutDownSocket();
if(server)
server->shutDownSocket();
FILE_LOG(logDEBUG) << "TCP Socket closed on port " << portNumber; FILE_LOG(logDEBUG) << "TCP Socket closed on port " << portNumber;
pthread_join(TCPServer_thread, nullptr); pthread_join(TCPServer_thread, nullptr);
tcpThreadCreated = false; tcpThreadCreated = false;
@ -131,15 +133,19 @@ void* slsReceiverTCPIPInterface::startTCPServerThread(void *this_pointer){
return this_pointer; return this_pointer;
} }
void slsReceiverTCPIPInterface::startTCPServer() { 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; << "]";
;
FILE_LOG(logINFO) << "SLS Receiver starting TCP Server on port "
<< portNumber << std::endl;
int ret = OK; int ret = OK;
server = sls::make_unique<sls::ServerSocket>(portNumber);
while (true) { while (true) {
auto server = sls::ServerSocket(portNumber);
auto socket = server.accept(); try {
auto socket = server->accept();
ret = decode_function(socket); ret = decode_function(socket);
// if(mySock->Connect() >= 0){ // if(mySock->Connect() >= 0){
// ret = decode_function(); // ret = decode_function();
@ -154,9 +160,14 @@ void slsReceiverTCPIPInterface::startTCPServer(){
} }
mySock->exitServer(); mySock->exitServer();
FILE_LOG(logINFOBLUE) << "Exiting [ TCP server Tid: " << syscall(SYS_gettid) <<"]"; FILE_LOG(logINFOBLUE)
<< "Exiting [ TCP server Tid: " << syscall(SYS_gettid)
<< "]";
pthread_exit(nullptr); pthread_exit(nullptr);
} }
}catch(const sls::SocketError& e){
std::cout << "Accept failed\n";
}
// if user entered exit // if user entered exit
if (killTCPServerThread) { if (killTCPServerThread) {
@ -165,15 +176,13 @@ void slsReceiverTCPIPInterface::startTCPServer(){
receiver->shutDownUDPSockets(); receiver->shutDownUDPSockets();
} }
} }
FILE_LOG(logINFOBLUE) << "Exiting [ TCP server Tid: " << syscall(SYS_gettid) <<"]"; FILE_LOG(logINFOBLUE)
<< "Exiting [ TCP server Tid: " << syscall(SYS_gettid) << "]";
pthread_exit(nullptr); pthread_exit(nullptr);
} }
} }
} }
int slsReceiverTCPIPInterface::function_table(){ int slsReceiverTCPIPInterface::function_table(){
flist[F_EXEC_RECEIVER_COMMAND] = &slsReceiverTCPIPInterface::exec_command; flist[F_EXEC_RECEIVER_COMMAND] = &slsReceiverTCPIPInterface::exec_command;
flist[F_EXIT_RECEIVER] = &slsReceiverTCPIPInterface::exit_server; 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) { if (fnum <= NUM_DET_FUNCTIONS || fnum >= NUM_REC_FUNCTIONS) {
FILE_LOG(logERROR) << "Unknown function enum " << fnum; FILE_LOG(logERROR) << "Unknown function enum " << fnum;
ret = (this->M_nofunc)(); ret = (this->M_nofunc)(socket);
} else{ } else{
FILE_LOG(logDEBUG1) << "calling function fnum: "<< fnum << " " FILE_LOG(logDEBUG1) << "calling function fnum: "<< fnum << " "
"(" << getFunctionNameFromEnum((enum detFuncs)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; ret = FAIL;
memset(mess, 0, sizeof(mess)); memset(mess, 0, sizeof(mess));
// to receive any arguments // to receive any arguments
socket.setReceiveTimeout(500);
int n = 1; int n = 1;
while (n > 0) 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); sprintf(mess,"Unrecognized Function enum %d. Please do not proceed.\n", fnum);
FILE_LOG(logERROR) << mess; 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);
} }

View File

@ -20,7 +20,9 @@ class DataSocket {
} }
size_t sendData(const void *buffer, size_t size); size_t sendData(const void *buffer, size_t size);
size_t receiveData(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 setTimeOut(int t_seconds);
int setReceiveTimeout(int us);
void close(); void close();
void shutDownSocket(); void shutDownSocket();

View File

@ -17,8 +17,8 @@
#endif #endif
#ifndef FILELOG_MAX_LEVEL #ifndef FILELOG_MAX_LEVEL
#define FILELOG_MAX_LEVEL logINFO // #define FILELOG_MAX_LEVEL logINFO
// #define FILELOG_MAX_LEVEL logDEBUG5 #define FILELOG_MAX_LEVEL logDEBUG5
#endif #endif

View File

@ -9,6 +9,7 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h>
namespace sls { namespace sls {
@ -43,12 +44,25 @@ size_t DataSocket::receiveData(void *buffer, size_t size) {
size_t dataRead = 0; size_t dataRead = 0;
while (dataRead < size) { while (dataRead < size) {
dataRead += dataRead +=
read(getSocketId(), reinterpret_cast<char *>(buffer) + dataRead, ::read(getSocketId(), reinterpret_cast<char *>(buffer) + dataRead,
size - dataRead); size - dataRead);
} }
return dataRead; return dataRead;
} }
size_t DataSocket::read(void *buffer, size_t size){
return ::read(getSocketId(), reinterpret_cast<char *>(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 DataSocket::sendData(const void *buffer, size_t size) {
size_t dataSent = 0; size_t dataSent = 0;
while (dataSent < size) { while (dataSent < size) {

View File

@ -27,7 +27,7 @@ ServerSocket::ServerSocket(int port)
if (bind(getSocketId(), (struct sockaddr *)&serverAddr, if (bind(getSocketId(), (struct sockaddr *)&serverAddr,
sizeof(serverAddr)) != 0) { sizeof(serverAddr)) != 0) {
close(); close();
throw std::runtime_error("Server ERROR: cannot bind socket"); throw sls::SocketError("Server ERROR: cannot bind socket");
} }
if (listen(getSocketId(), DEFAULT_BACKLOG) != 0) { if (listen(getSocketId(), DEFAULT_BACKLOG) != 0) {
close(); close();
@ -41,7 +41,7 @@ DataSocket ServerSocket::accept() {
int newSocket = int newSocket =
::accept(getSocketId(), (struct sockaddr *)&clientAddr, &addr_size); ::accept(getSocketId(), (struct sockaddr *)&clientAddr, &addr_size);
if (newSocket == -1) { 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_ntop(AF_INET, &(clientAddr.sin_addr), &thisClient_.front(),
INET_ADDRSTRLEN); INET_ADDRSTRLEN);