+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
+#include <csignal>
#include <cerrno>
#include <cstring>
#include <cassert>
void * PROTO::Runner(void * data)
{
+sigset_t signalSet;
+sigfillset(&signalSet);
+pthread_sigmask(SIG_BLOCK, &signalSet, NULL);
+
PROTO * protoPtr = static_cast<PROTO *>(data);
protoPtr->Run();
return NULL;
{
while (running)
{
- int res = poll(&pollFds.front(), pollFds.size(), timeout);
+ int res;
+ {
+ STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+ res = poll(&pollFds.front(), pollFds.size(), timeout);
+ }
if (res < 0)
break;
if (!running)
printfd(__FILE__, "PROTO::Run() - events: %d\n", res);
RecvPacket();
}
+ else
+ {
+ CheckTimeouts();
+ }
}
stopped = true;
}
+void PROTO::CheckTimeouts()
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+std::list<std::pair<uint32_t, USER> >::iterator it;
+for (it = users.begin(); it != users.end(); ++it)
+ {
+ int delta = difftime(time(NULL), it->second.GetPhaseChangeTime());
+ if ((it->second.GetPhase() == 3) &&
+ (delta > it->second.GetUserTimeout()))
+ {
+ printfd(__FILE__, "PROTO::CheckTimeouts() - user alive timeout (ip: %s, login: '%s', delta: %d > %d)\n", inet_ntostring(it->second.GetIP()).c_str(), it->second.GetLogin().c_str(), delta, it->second.GetUserTimeout());
+ it->second.SetPhase(1);
+ }
+ if ((it->second.GetPhase() == 2) &&
+ (delta > it->second.GetAliveTimeout()))
+ {
+ printfd(__FILE__, "PROTO::CheckTimeouts() - user connect timeout (ip: %s, login: '%s', delta: %d > %d)\n", inet_ntostring(it->second.GetIP()).c_str(), it->second.GetLogin().c_str(), delta, it->second.GetAliveTimeout());
+ it->second.SetPhase(1);
+ }
+ }
+}
+
bool PROTO::RecvPacket()
{
bool result = true;
if (it->revents)
{
it->revents = 0;
- printfd(__FILE__, "PROTO::RecvPacket() - pollfd: %d, socket: %d\n", it->fd, userIt->second.GetSocket());
assert(it->fd == userIt->second.GetSocket() && "File descriptors from poll fds and users must be syncked");
struct sockaddr_in addr;
socklen_t fromLen = sizeof(addr);
{
errorStr = "Unexpected CONN_SYN_ACK";
printfd(__FILE__, "PROTO::CONN_SYN_ACK_Proc() - wrong phase: %d\n", user->GetPhase());
+ return false;
}
user->SetPhase(3);
{
errorStr = "Unexpected ALIVE_SYN";
printfd(__FILE__, "PROTO::ALIVE_SYN_Proc() - wrong phase: %d\n", user->GetPhase());
+ return false;
}
user->SetPhase(3);
{
errorStr = "Unexpected DISCONN_SYN_ACK";
printfd(__FILE__, "PROTO::DISCONN_SYN_ACK_Proc() - wrong phase: %d\n", user->GetPhase());
+ return false;
}
if (user->GetRnd() + 1 != rnd)
{
errorStr = "Unexpected FIN";
printfd(__FILE__, "PROTO::FIN_Proc() - wrong phase: %d\n", user->GetPhase());
+ return false;
}
user->SetPhase(1);