Network: Include extra info in PACKET_CLIENT_ERROR packets
Log more details in server when PACKET_CLIENT_ERROR received
This commit is contained in:
@@ -25,7 +25,7 @@
|
|||||||
* @param s The socket to connect with.
|
* @param s The socket to connect with.
|
||||||
*/
|
*/
|
||||||
NetworkGameSocketHandler::NetworkGameSocketHandler(SOCKET s) : info(nullptr), client_id(INVALID_CLIENT_ID),
|
NetworkGameSocketHandler::NetworkGameSocketHandler(SOCKET s) : info(nullptr), client_id(INVALID_CLIENT_ID),
|
||||||
last_frame(_frame_counter), last_frame_server(_frame_counter)
|
last_frame(_frame_counter), last_frame_server(_frame_counter), last_pkt_type(PACKET_END)
|
||||||
{
|
{
|
||||||
this->sock = s;
|
this->sock = s;
|
||||||
this->last_packet = std::chrono::steady_clock::now();
|
this->last_packet = std::chrono::steady_clock::now();
|
||||||
@@ -67,6 +67,7 @@ NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p)
|
|||||||
PacketGameType type = (PacketGameType)p->Recv_uint8();
|
PacketGameType type = (PacketGameType)p->Recv_uint8();
|
||||||
|
|
||||||
this->last_packet = std::chrono::steady_clock::now();
|
this->last_packet = std::chrono::steady_clock::now();
|
||||||
|
this->last_pkt_type = type;
|
||||||
|
|
||||||
DEBUG(net, 3, "[tcp/game] received packet type %d from client %d, %s", type, this->client_id, this->GetDebugInfo().c_str());
|
DEBUG(net, 3, "[tcp/game] received packet type %d from client %d, %s", type, this->client_id, this->GetDebugInfo().c_str());
|
||||||
|
|
||||||
|
@@ -548,6 +548,7 @@ public:
|
|||||||
uint32 last_frame_server; ///< Last frame the server has executed
|
uint32 last_frame_server; ///< Last frame the server has executed
|
||||||
CommandQueue incoming_queue; ///< The command-queue awaiting handling
|
CommandQueue incoming_queue; ///< The command-queue awaiting handling
|
||||||
std::chrono::steady_clock::time_point last_packet; ///< Time we received the last frame.
|
std::chrono::steady_clock::time_point last_packet; ///< Time we received the last frame.
|
||||||
|
PacketGameType last_pkt_type;///< Last received packet type
|
||||||
|
|
||||||
NetworkRecvStatus CloseConnection(bool error = true) override;
|
NetworkRecvStatus CloseConnection(bool error = true) override;
|
||||||
|
|
||||||
|
@@ -253,7 +253,7 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res)
|
|||||||
this->CloseConnection(res);
|
this->CloseConnection(res);
|
||||||
} else {
|
} else {
|
||||||
/* This means we as client made a boo-boo. */
|
/* This means we as client made a boo-boo. */
|
||||||
SendError(errorno);
|
SendError(errorno, res);
|
||||||
|
|
||||||
/* Close connection before we make an emergency save, as the save can
|
/* Close connection before we make an emergency save, as the save can
|
||||||
* take a bit of time; better that the server doesn't stall while we
|
* take a bit of time; better that the server doesn't stall while we
|
||||||
@@ -547,11 +547,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Send an error-packet over the network */
|
/** Send an error-packet over the network */
|
||||||
NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode errorno)
|
NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode errorno, NetworkRecvStatus recvstatus)
|
||||||
{
|
{
|
||||||
Packet *p = new Packet(PACKET_CLIENT_ERROR, SHRT_MAX);
|
Packet *p = new Packet(PACKET_CLIENT_ERROR, SHRT_MAX);
|
||||||
|
|
||||||
p->Send_uint8(errorno);
|
p->Send_uint8(errorno);
|
||||||
|
p->Send_uint8(recvstatus);
|
||||||
|
p->Send_uint8(my_client->status);
|
||||||
|
p->Send_uint8(my_client->last_pkt_type);
|
||||||
my_client->SendPacket(p);
|
my_client->SendPacket(p);
|
||||||
return NETWORK_RECV_STATUS_OKAY;
|
return NETWORK_RECV_STATUS_OKAY;
|
||||||
}
|
}
|
||||||
|
@@ -92,7 +92,7 @@ public:
|
|||||||
|
|
||||||
static NetworkRecvStatus SendJoin();
|
static NetworkRecvStatus SendJoin();
|
||||||
static NetworkRecvStatus SendCommand(const CommandPacket *cp);
|
static NetworkRecvStatus SendCommand(const CommandPacket *cp);
|
||||||
static NetworkRecvStatus SendError(NetworkErrorCode errorno);
|
static NetworkRecvStatus SendError(NetworkErrorCode errorno, NetworkRecvStatus recvstatus = NETWORK_RECV_STATUS_OKAY);
|
||||||
static NetworkRecvStatus SendDesyncLog(const std::string &log);
|
static NetworkRecvStatus SendDesyncLog(const std::string &log);
|
||||||
static NetworkRecvStatus SendDesyncMessage(const char *msg);
|
static NetworkRecvStatus SendDesyncMessage(const char *msg);
|
||||||
static NetworkRecvStatus SendQuit();
|
static NetworkRecvStatus SendQuit();
|
||||||
|
@@ -1191,9 +1191,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
|
|||||||
char str[100];
|
char str[100];
|
||||||
char client_name[NETWORK_CLIENT_NAME_LENGTH];
|
char client_name[NETWORK_CLIENT_NAME_LENGTH];
|
||||||
NetworkErrorCode errorno = (NetworkErrorCode)p->Recv_uint8();
|
NetworkErrorCode errorno = (NetworkErrorCode)p->Recv_uint8();
|
||||||
|
NetworkRecvStatus rx_status = p->CanReadFromPacket(1) ? (NetworkRecvStatus)p->Recv_uint8() : NETWORK_RECV_STATUS_OKAY;
|
||||||
|
int8 status = p->CanReadFromPacket(1) ? (int8)p->Recv_uint8() : -1;
|
||||||
|
PacketGameType last_pkt_type = p->CanReadFromPacket(1) ? (PacketGameType)p->Recv_uint8() : PACKET_END;
|
||||||
|
|
||||||
/* The client was never joined.. thank the client for the packet, but ignore it */
|
/* The client was never joined.. thank the client for the packet, but ignore it */
|
||||||
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
|
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
|
||||||
|
if (_debug_net_level >= 2) GetString(str, GetNetworkErrorMsg(errorno), lastof(str));
|
||||||
|
DEBUG(net, 2, "non-joined client %d reported an error and is closing its connection (%s) (%d, %d, %d)", this->client_id, str, rx_status, status, last_pkt_type);
|
||||||
return this->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
|
return this->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1202,7 +1207,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
|
|||||||
StringID strid = GetNetworkErrorMsg(errorno);
|
StringID strid = GetNetworkErrorMsg(errorno);
|
||||||
GetString(str, strid, lastof(str));
|
GetString(str, strid, lastof(str));
|
||||||
|
|
||||||
DEBUG(net, 2, "'%s' reported an error and is closing its connection (%s)", client_name, str);
|
DEBUG(net, 2, "'%s' reported an error and is closing its connection (%s) (%d, %d, %d)", client_name, str, rx_status, status, last_pkt_type);
|
||||||
|
|
||||||
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, strid);
|
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, strid);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user