OpenTTD Source 20241224-master-gee860a5c8e
tcp_game.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
12#ifndef NETWORK_CORE_TCP_GAME_H
13#define NETWORK_CORE_TCP_GAME_H
14
15#include "os_abstraction.h"
16#include "tcp.h"
17#include "../network_type.h"
18#include "../../core/pool_type.hpp"
19#include <chrono>
20
25enum PacketGameType : uint8_t {
26 /*
27 * These first ten packets must remain in this order for backward and forward compatibility
28 * between clients that are trying to join directly. These packets can be received and/or sent
29 * by the server before the server has processed the 'join' packet from the client.
30 */
31
32 /* Packets sent by socket accepting code without ever constructing a client socket instance. */
35
36 /* Packets used by the client to join and an error message when the revision is wrong. */
39
40 /* Unused packet types, formerly used for the pre-game lobby. */
43
44 /* Packets used to get the game info. */
47
48 /* A server quitting this game. */
51
52 /*
53 * Packets after here assume that the client
54 * and server are running the same version. As
55 * such ordering is unimportant from here on.
56 *
57 * The following is the remainder of the packets
58 * sent as part of authenticating and getting
59 * the map and other important data.
60 */
61
62 /* After the join step, the first perform game authentication and enabling encryption. */
66
67 /* After the authentication is done, the next step is identification. */
69
70 /* After the identify step, the next is checking NewGRFs. */
73
74 /* The server welcomes the authenticated client and sends information of other clients. */
77
78 /* Getting the savegame/map. */
86
88
89 /*
90 * At this moment the client has the map and
91 * the client is fully authenticated. Now the
92 * normal communication starts.
93 */
94
95 /* Game progress monitoring. */
99
100 /* Sending commands around. */
103
104 /* Human communication! */
108
109 /* Remote console. */
112
113 /* Moving a client.*/
116
117 /* Configuration updates. */
120
121 /* A client quitting. */
126
128};
129
131struct CommandPacket;
132
138using CommandQueue = std::vector<CommandPacket>;
139
142/* TODO: rewrite into a proper class */
143private:
145 bool is_pending_deletion = false;
146
147protected:
149
155
161
174
181
187
194
204
212
221
230
238
245
251
258
265
272
279
285
291
298
309
318
326
337
349
360
370
380
387
393
400
407
415
421
427
435
443
452
458
466
473
481
483
484 NetworkGameSocketHandler(SOCKET s);
485public:
487 uint32_t last_frame;
490 std::chrono::steady_clock::time_point last_packet;
491
492 NetworkRecvStatus CloseConnection(bool error = true) override;
493
499 virtual ~NetworkGameSocketHandler() = default;
500
506 {
507 assert(info != nullptr && this->info == nullptr);
508 this->info = info;
509 }
510
516 {
517 return this->info;
518 }
519
521
522 const char *ReceiveCommand(Packet &p, CommandPacket &cp);
523 void SendCommand(Packet &p, const CommandPacket &cp);
524
525 bool IsPendingDeletion() const { return this->is_pending_deletion; }
526
527 void DeferDeletion();
528 static void ProcessDeferredDeletions();
529};
530
531#endif /* NETWORK_CORE_TCP_GAME_H */
Base socket handler for all TCP sockets.
Definition tcp_game.h:141
virtual NetworkRecvStatus Receive_CLIENT_MOVE(Packet &p)
Request the server to move this client into another company: uint8_t ID of the company the client wan...
Definition tcp_game.cpp:196
virtual NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet &p)
Sends that the server will begin with sending the map to the client: uint32_t Current frame.
Definition tcp_game.cpp:170
virtual NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet &p)
Sends the size of the map to the client.
Definition tcp_game.cpp:171
NetworkRecvStatus ReceivePackets()
Do the actual receiving of packets.
Definition tcp_game.cpp:134
bool is_pending_deletion
Whether this socket is pending deletion.
Definition tcp_game.h:145
virtual NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet &p)
Update the clients knowledge of the max settings: uint8_t Maximum number of companies allowed.
Definition tcp_game.cpp:197
virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet &p)
Notification that the client trying to join is banned.
Definition tcp_game.cpp:157
virtual NetworkRecvStatus Receive_SERVER_SYNC(Packet &p)
Sends a sync-check to the client: uint32_t Frame counter.
Definition tcp_game.cpp:177
virtual NetworkRecvStatus Receive_SERVER_COMMAND(Packet &p)
Sends a DoCommand to the client: uint8_t ID of the company (0..MAX_COMPANIES-1).
Definition tcp_game.cpp:180
virtual NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet &p)
Sends that all data of the map are sent to the client:
Definition tcp_game.cpp:173
virtual NetworkRecvStatus Receive_CLIENT_ACK(Packet &p)
Tell the server we are done with this frame: uint32_t Current frame counter of the client.
Definition tcp_game.cpp:178
virtual NetworkRecvStatus Receive_SERVER_ENABLE_ENCRYPTION(Packet &p)
Indication to the client that authentication is complete and encryption has to be used from here on f...
Definition tcp_game.cpp:166
virtual NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet &p)
Sends information about the game.
Definition tcp_game.cpp:161
uint32_t last_frame
Last frame we have executed.
Definition tcp_game.h:487
virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p)
The client is joined and ready to receive their map: uint32_t Own client ID.
Definition tcp_game.cpp:167
NetworkClientInfo * GetInfo() const
Gets the client info of this socket handler.
Definition tcp_game.h:515
virtual NetworkRecvStatus Receive_CLIENT_QUIT(Packet &p)
The client is quitting the game.
Definition tcp_game.cpp:185
virtual NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet &p)
Tell the server that we have the required GRFs.
Definition tcp_game.cpp:194
virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p)
Let the clients know that the server is closing.
Definition tcp_game.cpp:189
virtual NetworkRecvStatus Receive_SERVER_FRAME(Packet &p)
Sends the current frame counter to the client: uint32_t Frame counter uint32_t Frame counter max (how...
Definition tcp_game.cpp:176
virtual NetworkRecvStatus Receive_CLIENT_AUTH_RESPONSE(Packet &p)
Send the response to the authentication request: 32 * uint8_t Public key of the client.
Definition tcp_game.cpp:165
virtual NetworkRecvStatus Receive_SERVER_MOVE(Packet &p)
Move a client from one company into another: uint32_t ID of the client.
Definition tcp_game.cpp:195
virtual NetworkRecvStatus Receive_SERVER_AUTH_REQUEST(Packet &p)
Indication to the client that it needs to authenticate: uint8_t The NetworkAuthenticationMethod to us...
Definition tcp_game.cpp:164
virtual NetworkRecvStatus Receive_SERVER_QUIT(Packet &p)
Notification that a client left the game: uint32_t ID of the client.
Definition tcp_game.cpp:187
NetworkRecvStatus ReceiveInvalidPacket(PacketGameType type)
Helper for logging receiving invalid packets.
Definition tcp_game.cpp:150
virtual NetworkRecvStatus Receive_CLIENT_GETMAP(Packet &p)
Request the map from the server.
Definition tcp_game.cpp:168
ClientID client_id
Client identifier.
Definition tcp_game.h:486
virtual NetworkRecvStatus CloseConnection(NetworkRecvStatus status)=0
Close the network connection due to the given status.
CommandQueue incoming_queue
The command-queue awaiting handling.
Definition tcp_game.h:489
std::chrono::steady_clock::time_point last_packet
Time we received the last frame.
Definition tcp_game.h:490
virtual NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet &p)
Sends information about all used GRFs to the client: uint8_t Amount of GRFs (the following data is re...
Definition tcp_game.cpp:193
virtual NetworkRecvStatus Receive_CLIENT_JOIN(Packet &p)
Try to join the server: string OpenTTD revision (norev0000 if no revision).
Definition tcp_game.cpp:158
void SetInfo(NetworkClientInfo *info)
Sets the client info for this socket handler.
Definition tcp_game.h:505
virtual NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet &p)
Inform all clients that one client made an error and thus has quit/been disconnected: uint32_t ID of ...
Definition tcp_game.cpp:188
const char * ReceiveCommand(Packet &p, CommandPacket &cp)
Receives a command from the network.
virtual NetworkRecvStatus Receive_CLIENT_RCON(Packet &p)
Send an RCon command to the server: string RCon password.
Definition tcp_game.cpp:192
uint32_t last_frame_server
Last frame the server has executed.
Definition tcp_game.h:488
virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet &p)
The client made an error: uint8_t Error code caused (see NetworkErrorCode).
Definition tcp_game.cpp:159
virtual NetworkRecvStatus Receive_CLIENT_CHAT(Packet &p)
Sends a chat-packet to the server: uint8_t ID of the action (see NetworkAction).
Definition tcp_game.cpp:181
NetworkClientInfo * info
Client info related to this socket.
Definition tcp_game.h:144
NetworkRecvStatus HandlePacket(Packet &p)
Handle the given packet, i.e.
Definition tcp_game.cpp:64
virtual NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet &p)
Request game information.
Definition tcp_game.cpp:160
virtual NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet &p)
Tell the server that we are done receiving/loading the map.
Definition tcp_game.cpp:174
void SendCommand(Packet &p, const CommandPacket &cp)
Sends a command over the network.
virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet &p)
Sends a chat-packet to the client: uint8_t ID of the action (see NetworkAction).
Definition tcp_game.cpp:182
virtual NetworkRecvStatus Receive_SERVER_RCON(Packet &p)
Send the result of an issues RCon command back to the client: uint16_t Colour code.
Definition tcp_game.cpp:191
virtual NetworkRecvStatus Receive_CLIENT_COMMAND(Packet &p)
Send a DoCommand to the Server: uint8_t ID of the company (0..MAX_COMPANIES-1).
Definition tcp_game.cpp:179
virtual NetworkRecvStatus Receive_SERVER_JOIN(Packet &p)
A client joined (PACKET_CLIENT_MAP_OK), what usually directly follows is a PACKET_SERVER_CLIENT_INFO:...
Definition tcp_game.cpp:175
virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p)
Send information about a client: uint32_t ID of the client (always unique on a server.
Definition tcp_game.cpp:162
virtual NetworkRecvStatus Receive_SERVER_WAIT(Packet &p)
Notification that another client is currently receiving the map: uint8_t Number of clients waiting in...
Definition tcp_game.cpp:169
virtual NetworkRecvStatus Receive_CLIENT_IDENTIFY(Packet &p)
The client tells the server about the identity of the client: string Name of the client (max NETWORK_...
Definition tcp_game.cpp:163
virtual NetworkRecvStatus Receive_SERVER_FULL(Packet &p)
Notification that the server is full.
Definition tcp_game.cpp:156
NetworkRecvStatus CloseConnection(bool error=true) override
Functions to help ReceivePacket/SendPacket a bit A socket can make errors.
Definition tcp_game.cpp:43
virtual NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet &p)
Sends the data of the map to the client: Contains a part of the map (until max size of packet).
Definition tcp_game.cpp:172
virtual NetworkRecvStatus Receive_CLIENT_ERROR(Packet &p)
The client made an error and is quitting the game.
Definition tcp_game.cpp:186
virtual NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet &p)
Sends a chat-packet for external source to the client: string Name of the source this message came fr...
Definition tcp_game.cpp:183
virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p)
Let the clients know that the server is loading a new map.
Definition tcp_game.cpp:190
virtual NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet &p)
Gives the client a new name: string New name of the client.
Definition tcp_game.cpp:184
Base socket handler for all TCP sockets.
Definition tcp.h:31
NetworkRecvStatus
Status of a network client; reasons why a client has quit.
Definition core.h:23
ClientID
'Unique' identifier to be given to clients
Network stuff has many things that needs to be included and/or implemented by default.
Everything we need to know about a command to be able to execute it.
Container for all information known about a client.
Internal entity of a packet.
Definition packet.h:42
Basic functions to receive and send TCP packets.
PacketGameType
Enum with all types of TCP packets.
Definition tcp_game.h:25
@ PACKET_SERVER_UNUSED
Unused.
Definition tcp_game.h:42
@ PACKET_CLIENT_IDENTIFY
Client telling the server the client's name and requested company.
Definition tcp_game.h:68
@ PACKET_SERVER_JOIN
Tells clients that a new client has joined.
Definition tcp_game.h:87
@ PACKET_SERVER_MAP_SIZE
Server tells the client what the (compressed) size of the map is.
Definition tcp_game.h:82
@ PACKET_SERVER_RCON
Response of the executed command on the server.
Definition tcp_game.h:111
@ PACKET_SERVER_MAP_BEGIN
Server tells the client that it is beginning to send the map.
Definition tcp_game.h:81
@ PACKET_SERVER_SYNC
Server tells the client what the random state should be.
Definition tcp_game.h:98
@ PACKET_CLIENT_GETMAP
Client requests the actual map.
Definition tcp_game.h:79
@ PACKET_CLIENT_ERROR
A client reports an error to the server.
Definition tcp_game.h:124
@ PACKET_SERVER_WAIT
Server tells the client there are some people waiting for the map as well.
Definition tcp_game.h:80
@ PACKET_END
Must ALWAYS be on the end of this list!! (period)
Definition tcp_game.h:127
@ PACKET_SERVER_CONFIG_UPDATE
Some network configuration important to the client changed.
Definition tcp_game.h:119
@ PACKET_CLIENT_JOIN
The client telling the server it wants to join.
Definition tcp_game.h:37
@ PACKET_CLIENT_AUTH_RESPONSE
The client responds to the authentication request.
Definition tcp_game.h:64
@ PACKET_CLIENT_NEWGRFS_CHECKED
Client acknowledges that it has all required NewGRFs.
Definition tcp_game.h:72
@ PACKET_SERVER_ENABLE_ENCRYPTION
The server tells that authentication has completed and requests to enable encryption with the keys of...
Definition tcp_game.h:65
@ PACKET_SERVER_GAME_INFO
Information about the server.
Definition tcp_game.h:45
@ PACKET_CLIENT_COMMAND
Client executed a command and sends it to the server.
Definition tcp_game.h:101
@ PACKET_SERVER_ERROR_QUIT
A server tells that a client has hit an error and did quit.
Definition tcp_game.h:125
@ PACKET_SERVER_CLIENT_INFO
Server sends you information about a client.
Definition tcp_game.h:76
@ PACKET_CLIENT_SET_NAME
A client changes its name.
Definition tcp_game.h:118
@ PACKET_SERVER_WELCOME
Server welcomes you and gives you your ClientID.
Definition tcp_game.h:75
@ PACKET_CLIENT_ACK
The client tells the server which frame it has executed.
Definition tcp_game.h:97
@ PACKET_SERVER_BANNED
The server has banned you.
Definition tcp_game.h:34
@ PACKET_SERVER_FRAME
Server tells the client what frame it is in, and thus to where the client may progress.
Definition tcp_game.h:96
@ PACKET_SERVER_EXTERNAL_CHAT
Server distributing the message from external source.
Definition tcp_game.h:107
@ PACKET_SERVER_CHAT
Server distributing the message of a client (or itself).
Definition tcp_game.h:106
@ PACKET_SERVER_COMMAND
Server distributes a command to (all) the clients.
Definition tcp_game.h:102
@ PACKET_SERVER_SHUTDOWN
The server is shutting down.
Definition tcp_game.h:50
@ PACKET_SERVER_AUTH_REQUEST
The server requests the client to authenticate using a number of methods.
Definition tcp_game.h:63
@ PACKET_CLIENT_RCON
Client asks the server to execute some command.
Definition tcp_game.h:110
@ PACKET_SERVER_NEWGAME
The server is preparing to start a new game.
Definition tcp_game.h:49
@ PACKET_SERVER_MOVE
Server tells everyone that someone is moved to another company.
Definition tcp_game.h:115
@ PACKET_CLIENT_UNUSED
Unused.
Definition tcp_game.h:41
@ PACKET_SERVER_MAP_DATA
Server sends bits of the map to the client.
Definition tcp_game.h:83
@ PACKET_CLIENT_MAP_OK
Client tells the server that it received the whole map.
Definition tcp_game.h:85
@ PACKET_CLIENT_QUIT
A client tells the server it is going to quit.
Definition tcp_game.h:122
@ PACKET_CLIENT_MOVE
A client would like to be moved to another company.
Definition tcp_game.h:114
@ PACKET_SERVER_FULL
The server is full and has no place for you.
Definition tcp_game.h:33
@ PACKET_SERVER_QUIT
A server tells that a client has quit.
Definition tcp_game.h:123
@ PACKET_SERVER_ERROR
Server sending an error message to the client.
Definition tcp_game.h:38
@ PACKET_SERVER_CHECK_NEWGRFS
Server sends NewGRF IDs and MD5 checksums for the client to check.
Definition tcp_game.h:71
@ PACKET_SERVER_MAP_DONE
Server tells it has just sent the last bits of the map to the client.
Definition tcp_game.h:84
@ PACKET_CLIENT_CHAT
Client said something that should be distributed.
Definition tcp_game.h:105
@ PACKET_CLIENT_GAME_INFO
Request information about the server.
Definition tcp_game.h:46
std::vector< CommandPacket > CommandQueue
A "queue" of CommandPackets.
Definition tcp_game.h:138