namespace SecurityManager {
struct ConnectionID {
- int sock; // This is decriptor used for connection
- int counter; // Unique handler per socket
- inline bool operator<(const ConnectionID &second) const {
- return counter < second.counter;
- }
+ int sock; // Socket file descriptor number.
+ unsigned counter; // Unique counter per that descriptor number.
};
struct GenericSocketManager;
struct SocketDescription {
bool isOpen = false;
bool isTimeout = false;
- int counter = -1;
+ unsigned counter = 0;
time_t timeout = 0;
MessageBuffer buffer;
};
fd_set m_writeSet;
int m_maxDesc = 0;
int m_signalFd, m_listenSock = -1, m_notifyMe;
- int m_counter = 0;
std::mutex m_eventQueueMutex;
std::queue<WriteBuffer> m_writeBufferQueue;
std::queue<ConnectionID> m_closeQueue;
auto &desc = m_socketDescriptionVector[sock];
desc.isOpen = true;
- desc.counter = ++m_counter;
desc.timeout = monotonicNow() + SOCKET_TIMEOUT;
desc.buffer.InitForInput();
auto &desc = m_socketDescriptionVector[buffer.connectionID.sock];
- if (!desc.isOpen) {
- LogDebug("Received packet for write but connection is closed. Packet ignored! Socket: "
- << buffer.connectionID.sock);
- continue;
- }
-
if (desc.counter != buffer.connectionID.counter)
{
- LogDebug("Received packet for write but counter is broken. Packet ignored! Socket: "
+ LogDebug("Received packet for write but connection is closed. Packet ignored! Socket: "
<< buffer.connectionID.sock);
continue;
}
m_closeQueue.pop();
}
- if (!m_socketDescriptionVector[connection.sock].isOpen)
- continue;
-
if (connection.counter != m_socketDescriptionVector[connection.sock].counter)
continue;
}
desc.isOpen = false;
+ desc.counter++;
desc.buffer.Clear();
close(sock);
void BaseService::process(MessageEvent &&event)
{
- LogDebug("Message event for counter: " << event.connectionID.counter);
+ LogDebug("Message event for socket " << event.connectionID.sock <<
+ " counter " << event.connectionID.counter);
processOne(event.connectionID, event.creds, event.messageBuffer);
}