Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #ifndef NETWORK_SERVER_H
00013 #define NETWORK_SERVER_H
00014
00015 #ifdef ENABLE_NETWORK
00016
00017 #include "network_internal.h"
00018 #include "core/tcp_listen.h"
00019 #include "../thread/thread.h"
00020
00021 class ServerNetworkGameSocketHandler;
00022 typedef ServerNetworkGameSocketHandler NetworkClientSocket;
00023 typedef Pool<NetworkClientSocket, ClientIndex, 8, MAX_CLIENT_SLOTS> NetworkClientSocketPool;
00024 extern NetworkClientSocketPool _networkclientsocket_pool;
00025
00027 class ServerNetworkGameSocketHandler : public NetworkClientSocketPool::PoolItem<&_networkclientsocket_pool>, public NetworkGameSocketHandler, public TCPListenHandler<ServerNetworkGameSocketHandler, PACKET_SERVER_FULL, PACKET_SERVER_BANNED> {
00028 protected:
00029 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_JOIN);
00030 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_INFO);
00031 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_GAME_PASSWORD);
00032 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_PASSWORD);
00033 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_GETMAP);
00034 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_MAP_OK);
00035 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_ACK);
00036 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND);
00037 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_CHAT);
00038 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD);
00039 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME);
00040 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_QUIT);
00041 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_ERROR);
00042 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_RCON);
00043 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED);
00044 DECLARE_GAME_RECEIVE_COMMAND(PACKET_CLIENT_MOVE);
00045
00046 NetworkRecvStatus SendCompanyInfo();
00047 NetworkRecvStatus SendNewGRFCheck();
00048 NetworkRecvStatus SendWelcome();
00049 NetworkRecvStatus SendWait();
00050 NetworkRecvStatus SendNeedGamePassword();
00051 NetworkRecvStatus SendNeedCompanyPassword();
00052
00053 public:
00055 enum ClientStatus {
00056 STATUS_INACTIVE,
00057 STATUS_NEWGRFS_CHECK,
00058 STATUS_AUTH_GAME,
00059 STATUS_AUTH_COMPANY,
00060 STATUS_AUTHORIZED,
00061 STATUS_MAP_WAIT,
00062 STATUS_MAP,
00063 STATUS_DONE_MAP,
00064 STATUS_PRE_ACTIVE,
00065 STATUS_ACTIVE,
00066 STATUS_END
00067 };
00068
00069 byte lag_test;
00070 byte last_token;
00071 uint32 last_token_frame;
00072 ClientStatus status;
00073 CommandQueue outgoing_queue;
00074 int receive_limit;
00075
00076 Packet *savegame_packets;
00077 struct PacketWriter *savegame;
00078 ThreadMutex *savegame_mutex;
00079 NetworkAddress client_address;
00080
00081 ServerNetworkGameSocketHandler(SOCKET s);
00082 ~ServerNetworkGameSocketHandler();
00083
00084 virtual Packet *ReceivePacket();
00085 virtual void SendPacket(Packet *packet);
00086 NetworkRecvStatus CloseConnection(NetworkRecvStatus status);
00087 void GetClientName(char *client_name, size_t size) const;
00088
00089 NetworkRecvStatus SendMap();
00090 NetworkRecvStatus SendErrorQuit(ClientID client_id, NetworkErrorCode errorno);
00091 NetworkRecvStatus SendQuit(ClientID client_id);
00092 NetworkRecvStatus SendShutdown();
00093 NetworkRecvStatus SendNewGame();
00094 NetworkRecvStatus SendRConResult(uint16 colour, const char *command);
00095 NetworkRecvStatus SendMove(ClientID client_id, CompanyID company_id);
00096
00097 NetworkRecvStatus SendClientInfo(NetworkClientInfo *ci);
00098 NetworkRecvStatus SendError(NetworkErrorCode error);
00099 NetworkRecvStatus SendChat(NetworkAction action, ClientID client_id, bool self_send, const char *msg, int64 data);
00100 NetworkRecvStatus SendJoin(ClientID client_id);
00101 NetworkRecvStatus SendFrame();
00102 NetworkRecvStatus SendSync();
00103 NetworkRecvStatus SendCommand(const CommandPacket *cp);
00104 NetworkRecvStatus SendCompanyUpdate();
00105 NetworkRecvStatus SendConfigUpdate();
00106
00107 static void Send();
00108 static void AcceptConnection(SOCKET s, const NetworkAddress &address);
00109 static bool AllowConnection();
00110
00115 static const char *GetName()
00116 {
00117 return "server";
00118 }
00119
00120 const char *GetClientIP();
00121
00122 static ServerNetworkGameSocketHandler *GetByClientID(ClientID client_id);
00123 };
00124
00125 void NetworkServer_Tick(bool send_frame);
00126 void NetworkServerSetCompanyPassword(CompanyID company_id, const char *password, bool already_hashed = true);
00127
00128 #define FOR_ALL_CLIENT_SOCKETS_FROM(var, start) FOR_ALL_ITEMS_FROM(NetworkClientSocket, clientsocket_index, var, start)
00129 #define FOR_ALL_CLIENT_SOCKETS(var) FOR_ALL_CLIENT_SOCKETS_FROM(var, 0)
00130
00131 #else
00132
00133
00134 static inline void NetworkServerMonthlyLoop() {}
00135 static inline void NetworkServerYearlyLoop() {}
00136
00137 #endif
00138
00139 #endif