]> git.stg.codes - stg.git/commitdiff
Timeouts checking added partially
authorMaxim Mamontov <faust@gts.dp.ua>
Wed, 11 May 2011 14:57:18 +0000 (17:57 +0300)
committerMaxim Mamontov <faust@gts.dp.ua>
Wed, 11 May 2011 14:57:18 +0000 (17:57 +0300)
projects/sgauthstress/proto.cpp
projects/sgauthstress/proto.h

index dd4984caca545bf5d0243aefa067fab8f8ea47ad..2e97fd2a0990c165c8d3089a0096866440f1a722 100644 (file)
@@ -172,7 +172,11 @@ void PROTO::Run()
 {
 while (running)
     {
 {
 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)
     if (res < 0)
         break;
     if (!running)
@@ -182,11 +186,37 @@ while (running)
         printfd(__FILE__, "PROTO::Run() - events: %d\n", res);
         RecvPacket();
         }
         printfd(__FILE__, "PROTO::Run() - events: %d\n", res);
         RecvPacket();
         }
+    else
+        {
+        CheckTimeouts();
+        }
     }
 
 stopped = true;
 }
 
     }
 
 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;
 bool PROTO::RecvPacket()
 {
 bool result = true;
@@ -198,7 +228,6 @@ for (it = pollFds.begin(), userIt = users.begin(); it != pollFds.end() && userIt
     if (it->revents)
         {
         it->revents = 0;
     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);
         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);
@@ -260,6 +289,7 @@ if (user->GetPhase() != 2)
     {
     errorStr = "Unexpected CONN_SYN_ACK";
     printfd(__FILE__, "PROTO::CONN_SYN_ACK_Proc() - wrong phase: %d\n", user->GetPhase());
     {
     errorStr = "Unexpected CONN_SYN_ACK";
     printfd(__FILE__, "PROTO::CONN_SYN_ACK_Proc() - wrong phase: %d\n", user->GetPhase());
+    return false;
     }
 
 user->SetPhase(3);
     }
 
 user->SetPhase(3);
@@ -288,6 +318,7 @@ if (user->GetPhase() != 3)
     {
     errorStr = "Unexpected ALIVE_SYN";
     printfd(__FILE__, "PROTO::ALIVE_SYN_Proc() - wrong phase: %d\n", user->GetPhase());
     {
     errorStr = "Unexpected ALIVE_SYN";
     printfd(__FILE__, "PROTO::ALIVE_SYN_Proc() - wrong phase: %d\n", user->GetPhase());
+    return false;
     }
 
 user->SetPhase(3);
     }
 
 user->SetPhase(3);
@@ -312,6 +343,7 @@ if (user->GetPhase() != 4)
     {
     errorStr = "Unexpected DISCONN_SYN_ACK";
     printfd(__FILE__, "PROTO::DISCONN_SYN_ACK_Proc() - wrong phase: %d\n", user->GetPhase());
     {
     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)
     }
 
 if (user->GetRnd() + 1 != rnd)
@@ -334,6 +366,7 @@ if (user->GetPhase() != 5)
     {
     errorStr = "Unexpected FIN";
     printfd(__FILE__, "PROTO::FIN_Proc() - wrong phase: %d\n", user->GetPhase());
     {
     errorStr = "Unexpected FIN";
     printfd(__FILE__, "PROTO::FIN_Proc() - wrong phase: %d\n", user->GetPhase());
+    return false;
     }
 
 user->SetPhase(1);
     }
 
 user->SetPhase(1);
index ed17f876d6544c8f40310a5066ef61d87c5dc4eb..543ae9e71b114c8ecb064c077364160eae9243f2 100644 (file)
@@ -60,6 +60,7 @@ class PROTO {
         static void * Runner(void * data);
 
         void Run();
         static void * Runner(void * data);
 
         void Run();
+        void CheckTimeouts();
         bool RecvPacket();
         bool SendPacket(const void * buffer, size_t length, USER * user);
         bool HandlePacket(const char * buffer, size_t length, USER * user);
         bool RecvPacket();
         bool SendPacket(const void * buffer, size_t length, USER * user);
         bool HandlePacket(const char * buffer, size_t length, USER * user);