#ifndef __PROTO_H__
#define __PROTO_H__
+#ifndef LINUX
+#include <netinet/in_systm.h>
+#endif
#include <netinet/ip.h>
#include <pthread.h>
+#include <poll.h>
#include <string>
+#include <list>
+#include <vector>
#include <map>
#include "stg/os_int.h"
class PROTO;
-typedef bool (PROTO::*PacketProcessor)(char *);
+typedef bool (PROTO::*PacketProcessor)(const void *, USER *);
class PROTO {
public:
const std::string GetStrError() const { return errorStr; }
- bool Connect(const std::string & login);
- bool Disconnect(const std::string & login);
+ void AddUser(const USER & user, bool connect = false);
+
+ bool Connect(uint32_t ip);
+ bool Disconnect(uint32_t ip);
+
+ size_t UserCount() const { return users.size(); }
private:
- int sock;
BLOWFISH_CTX ctx;
struct sockaddr_in localAddr;
struct sockaddr_in serverAddr;
int timeout;
- std::map<std::string, USER> users;
+ std::list<std::pair<uint32_t, USER> > users;
+ std::vector<struct pollfd> pollFds;
bool running;
bool stopped;
pthread_t tid;
+ pthread_mutex_t mutex;
std::string errorStr;
static void * Runner(void * data);
void Run();
+ void CheckTimeouts();
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);
+ bool SendPacket(const void * buffer, size_t length, USER * user);
+ bool HandlePacket(const char * buffer, size_t length, USER * user);
+
+ bool CONN_SYN_ACK_Proc(const void * buffer, USER * user);
+ bool ALIVE_SYN_Proc(const void * buffer, USER * user);
+ bool DISCONN_SYN_ACK_Proc(const void * buffer, USER * user);
+ bool FIN_Proc(const void * buffer, USER * user);
+ bool INFO_Proc(const void * buffer, USER * user);
+ bool ERR_Proc(const void * buffer, USER * user);
+
+ bool Send_CONN_SYN(USER * user);
+ bool Send_CONN_ACK(USER * user);
+ bool Send_DISCONN_SYN(USER * user);
+ bool Send_DISCONN_ACK(USER * user);
+ bool Send_ALIVE_ACK(USER * user);
+
+ bool RealConnect(USER * user);
+ bool RealDisconnect(USER * user);
};
#endif