diff --git a/Socket.cpp b/Socket.cpp index f6ecab7..6bd006f 100644 --- a/Socket.cpp +++ b/Socket.cpp @@ -68,47 +68,47 @@ namespace core void Socket::onUnregistered() {} bool Socket::eventReceived(struct epoll_event event, long long eventId) { -// coreutils::Log(coreutils::LOG_DEBUG_1) << "Event process beginning for socket " << getDescriptor(); + coreutils::Log(coreutils::LOG_DEBUG_1) << "Event process beginning for socket " << getDescriptor(); if(inHandler) - // coreutils::Log(coreutils::LOG_DEBUG_2) << "inHandler was already true."; - inHandler = true; + coreutils::Log(coreutils::LOG_DEBUG_2) << "inHandler was already true."; + inHandler = true; if(event.events & EPOLLRDHUP) { -// coreutils::Log(coreutils::LOG_DEBUG_2) << "EPOLLRDHUP"; + coreutils::Log(coreutils::LOG_DEBUG_2) << "EPOLLRDHUP"; readHangup = true; shutdown("hangup received"); } if(event.events & EPOLLIN) { -// coreutils::Log(coreutils::LOG_DEBUG_2) << "EPOLLIN"; + coreutils::Log(coreutils::LOG_DEBUG_2) << "EPOLLIN"; coreutils::ZString zbuffer(buffer, length); lock.lock(); receiveData(zbuffer); if(!shutDown) { inHandler = false; - lock.unlock(); + lock.unlock(); resetSocket(); } } if(event.events & EPOLLWRNORM) { -// coreutils::Log(coreutils::LOG_DEBUG_2) << "EPOLLWRNORM"; + coreutils::Log(coreutils::LOG_DEBUG_2) << "EPOLLWRNORM"; writeSocket(); inHandler = false; - resetSocket(); + resetSocket(); } inHandler = false; -// coreutils::Log(coreutils::LOG_DEBUG_1) << "Event process ending for socket " << getDescriptor(); + coreutils::Log(coreutils::LOG_DEBUG_1) << "Event process ending for socket " << getDescriptor(); return !shutDown; } - - void Socket::onDataReceived(std::string data) - { + + void Socket::connectionRequest() {} + + void Socket::onDataReceived(std::string data) { throw coreutils::Exception("Need to override onDataReceived.", __FILE__, __LINE__, -1); } - - void Socket::onDataReceived(coreutils::ZString &data) - { + + void Socket::onDataReceived(coreutils::ZString &data) { onDataReceived(std::string(data.getData(), data.getLength())); } - + void Socket::receiveData(coreutils::ZString &buffer) { coreutils::ZString blank(""); if(buffer.getLength() <= 0) @@ -117,36 +117,31 @@ namespace core int error = -1; if((len = ::read(getDescriptor(), buffer.getData(), buffer.getLength())) >= 0) { coreutils::ZString zbuffer(buffer.getData(), len); -// coreutils::Log(coreutils::LOG_DEBUG_1) << zbuffer; + // coreutils::Log(coreutils::LOG_DEBUG_1) << zbuffer; onDataReceived(zbuffer); - } - else - { - - error = errno; - - switch (error) - { - + } else { + error = errno; + switch (error) { + // When a listening socket receives a connection - // request we get one of these. - // - case ENOTCONN: - onDataReceived(blank); + // request we get one of these. + + case ENOTCONN: + connectionRequest(); break; - - case ECONNRESET: + + case ECONNRESET: break; - - default: + + default: throw coreutils::Exception("Error in read of data from socket.", __FILE__, __LINE__, error); } } } - + void Socket::writeSocket() { outlock.lock(); -// coreutils::Log(coreutils::LOG_DEBUG_3) << "writing data to socket " << getDescriptor(); + // coreutils::Log(coreutils::LOG_DEBUG_3) << "writing data to socket " << getDescriptor(); if(fifo.size() > 0) { if(!shutDown) int rc = ::write(descriptor, fifo.front().c_str(), fifo.front().length()); @@ -154,7 +149,7 @@ namespace core } outlock.unlock(); } - + int Socket::write(std::string data) { outlock.lock(); fifo.emplace(data); diff --git a/Socket.h b/Socket.h index 6411337..cc70c41 100644 --- a/Socket.h +++ b/Socket.h @@ -137,6 +137,13 @@ namespace core { // virtual void onConnected(); ///< Called when socket is open and ready to communicate. + /// + /// The connectionRequest method is called to instantiate a new session handler object + /// and form a new connection to a listening server. + /// + + virtual void connectionRequest(); + /// /// /// diff --git a/TCPServer.cpp b/TCPServer.cpp index b87fd83..4a78281 100644 --- a/TCPServer.cpp +++ b/TCPServer.cpp @@ -25,7 +25,8 @@ namespace core { close(getDescriptor()); } - void TCPServer::onDataReceived(std::string data) { + void TCPServer::connectionRequest() { + coreutils::Log(coreutils::LOG_DEBUG_2) << "Connection request is being received on socket " << getDescriptor() << "."; lock.lock(); TCPSession *session = accept(); if (session) diff --git a/TCPServer.h b/TCPServer.h index 343f412..389ccfb 100644 --- a/TCPServer.h +++ b/TCPServer.h @@ -125,16 +125,11 @@ namespace core { protected: /// - /// Override the virtual dataReceived since for the server these - /// are requests to accept the new connection socket. - /// No data is to be read or written when this method is called. It is the response to - /// the fact that a new connection is coming into the system - /// - /// @param data the pointer to the buffer containing the received data. - /// @param length the length of the associated data buffer. + /// This method is called by the lower socket when a connection request comes into + /// the listening and bound server port. /// - void onDataReceived(std::string data) override; + void connectionRequest() override; /// /// This method is called when the Command associated with this object is requested diff --git a/testing/consoleserver b/testing/consoleserver index ee48bc9..32053fc 100755 Binary files a/testing/consoleserver and b/testing/consoleserver differ diff --git a/testing/main.cpp b/testing/main.cpp index 634cd98..975bffe 100644 --- a/testing/main.cpp +++ b/testing/main.cpp @@ -17,7 +17,7 @@ int main(int argc, char **argv) { core::EPoll ePoll; - core::ConsoleServer console(ePoll, core::IPAddress(ipAddress, 1027)); + core::TCPServer console(ePoll, core::IPAddress(ipAddress, 1027)); console.commands.add(ePoll, "threads"); console.commands.add(console, "consoles");