|
|
|
@ -33,6 +33,7 @@
|
|
|
|
|
#include "../thread.h"
|
|
|
|
|
#include "../crashlog.h"
|
|
|
|
|
#include "../core/checksum_func.hpp"
|
|
|
|
|
#include "../fileio_func.h"
|
|
|
|
|
|
|
|
|
|
#include "table/strings.h"
|
|
|
|
|
|
|
|
|
@ -162,6 +163,15 @@ ClientNetworkGameSocketHandler::~ClientNetworkGameSocketHandler()
|
|
|
|
|
_network_settings_access = false;
|
|
|
|
|
|
|
|
|
|
delete this->savegame;
|
|
|
|
|
|
|
|
|
|
if (this->desync_log_file) {
|
|
|
|
|
if (!this->server_desync_log.empty()) {
|
|
|
|
|
fwrite("\n", 1, 1, this->desync_log_file);
|
|
|
|
|
fwrite(this->server_desync_log.data(), 1, this->server_desync_log.size(), this->desync_log_file);
|
|
|
|
|
}
|
|
|
|
|
FioFCloseFile(this->desync_log_file);
|
|
|
|
|
this->desync_log_file = nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NetworkRecvStatus ClientNetworkGameSocketHandler::CloseConnection(NetworkRecvStatus status)
|
|
|
|
@ -175,6 +185,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
|
|
|
|
|
* that code any more complex or more aware of the validity of the socket.
|
|
|
|
|
*/
|
|
|
|
|
if (this->sock == INVALID_SOCKET) return status;
|
|
|
|
|
if (this->status == STATUS_CLOSING) return status;
|
|
|
|
|
|
|
|
|
|
DEBUG(net, 1, "Shutting down client connection %d", this->client_id);
|
|
|
|
|
|
|
|
|
@ -192,6 +203,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
|
|
|
|
|
|
|
|
|
|
DEBUG(net, 1, "Shutdown client connection %d", this->client_id);
|
|
|
|
|
|
|
|
|
|
if (status == NETWORK_RECV_STATUS_DESYNC) {
|
|
|
|
|
this->status = STATUS_CLOSING;
|
|
|
|
|
this->ignore_close = true;
|
|
|
|
|
this->ReceivePackets();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete this->GetInfo();
|
|
|
|
|
delete this;
|
|
|
|
|
|
|
|
|
@ -302,6 +319,7 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res)
|
|
|
|
|
DEBUG(net, 0, "Sync error detected!");
|
|
|
|
|
|
|
|
|
|
std::string desync_log;
|
|
|
|
|
info.log_file = &(my_client->desync_log_file);
|
|
|
|
|
CrashLog::DesyncCrashLog(nullptr, &desync_log, info);
|
|
|
|
|
my_client->SendDesyncLog(desync_log);
|
|
|
|
|
my_client->ClientError(NETWORK_RECV_STATUS_DESYNC);
|
|
|
|
@ -968,6 +986,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet
|
|
|
|
|
|
|
|
|
|
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p)
|
|
|
|
|
{
|
|
|
|
|
if (this->status == STATUS_CLOSING) return NETWORK_RECV_STATUS_OKAY;
|
|
|
|
|
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
|
|
|
|
|
|
|
|
|
_frame_counter_server = p->Recv_uint32();
|
|
|
|
@ -1002,6 +1021,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p
|
|
|
|
|
|
|
|
|
|
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p)
|
|
|
|
|
{
|
|
|
|
|
if (this->status == STATUS_CLOSING) return NETWORK_RECV_STATUS_OKAY;
|
|
|
|
|
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
|
|
|
|
|
|
|
|
|
_sync_frame = p->Recv_uint32();
|
|
|
|
@ -1016,6 +1036,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p)
|
|
|
|
|
|
|
|
|
|
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet *p)
|
|
|
|
|
{
|
|
|
|
|
if (this->status == STATUS_CLOSING) return NETWORK_RECV_STATUS_OKAY;
|
|
|
|
|
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
|
|
|
|
|
|
|
|
|
CommandPacket cp;
|
|
|
|
@ -1035,6 +1056,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet
|
|
|
|
|
|
|
|
|
|
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p)
|
|
|
|
|
{
|
|
|
|
|
if (this->status == STATUS_CLOSING) return NETWORK_RECV_STATUS_OKAY;
|
|
|
|
|
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
|
|
|
|
|
|
|
|
|
char name[NETWORK_NAME_LENGTH], msg[NETWORK_CHAT_LENGTH];
|
|
|
|
@ -1092,6 +1114,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Pack
|
|
|
|
|
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
|
|
|
|
|
|
|
|
|
ClientID client_id = (ClientID)p->Recv_uint32();
|
|
|
|
|
if (client_id == _network_own_client_id) return NETWORK_RECV_STATUS_OKAY; // do not try to clear our own client info
|
|
|
|
|
|
|
|
|
|
NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id);
|
|
|
|
|
if (ci != nullptr) {
|
|
|
|
@ -1104,6 +1127,15 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Pack
|
|
|
|
|
return NETWORK_RECV_STATUS_OKAY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_DESYNC_LOG(Packet *p)
|
|
|
|
|
{
|
|
|
|
|
uint size = p->Recv_uint16();
|
|
|
|
|
this->server_desync_log.resize(this->server_desync_log.size() + size);
|
|
|
|
|
p->Recv_binary(const_cast<char *>(this->server_desync_log.data() + this->server_desync_log.size() - size), size);
|
|
|
|
|
DEBUG(net, 2, "Received %u bytes of server desync log", size);
|
|
|
|
|
return NETWORK_RECV_STATUS_OKAY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p)
|
|
|
|
|
{
|
|
|
|
|
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
|
|
|
|