]> git.stg.codes - stg.git/blobdiff - projects/sgauthstress/proto.h
Add proto implementation and user state holder
[stg.git] / projects / sgauthstress / proto.h
diff --git a/projects/sgauthstress/proto.h b/projects/sgauthstress/proto.h
new file mode 100644 (file)
index 0000000..f478c0e
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef __PROTO_H__
+#define __PROTO_H__
+
+#include <netinet/ip.h>
+#include <pthread.h>
+
+#include <string>
+#include <map>
+
+#include "stg/os_int.h"
+#include "stg/blowfish.h"
+
+#include "user.h"
+
+class PROTO;
+
+typedef bool (PROTO::*PacketProcessor)(char *);
+
+class PROTO {
+    public:
+        PROTO(const std::string & server,
+              uint16_t port,
+              uint16_t localPort,
+              int timeout = 1);
+        ~PROTO();
+
+        bool Start();
+        bool Stop();
+
+        const std::string GetStrError() const { return errorStr; }
+
+        bool Connect(const std::string & login);
+        bool Disconnect(const std::string & login);
+    private:
+        int sock;
+        BLOWFISH_CTX ctx;
+        struct sockaddr_in localAddr;
+        struct sockaddr_in serverAddr;
+        int timeout;
+
+        std::map<std::string, USER> users;
+
+        bool running;
+        bool stopped;
+
+        pthread_t tid;
+
+        std::string errorStr;
+
+        std::map<std::string, PacketProcessor> processors;
+
+        static void * Runner(void * data);
+
+        void Run();
+        bool RecvPacket();
+        bool HandlePacket(char * buffer);
+
+        bool CONN_SYN_ACK_Proc(char * buffer);
+        bool ALIVE_SYN_Proc(char * buffer);
+        bool DISCONN_SYN_ACK_Proc(char * buffer);
+        bool FIN_Proc(char * buffer);
+        bool INFO_Proc(char * buffer);
+        bool ERR_Proc(char * buffer);
+};
+
+#endif