Changeset - r25293:51d13a17d6ec
[Not reviewed]
master
0 5 0
Patric Stout - 3 years ago 2021-04-26 18:04:02
truebrain@openttd.org
Change: no longer use UDP when entering the lobby of a server

The lobby of a server requested some parts via UDP and some via
TCP. This is strictly seen fine, but for future extensions it
is a lot easier if just one protocol is used.
5 files changed with 48 insertions and 10 deletions:
0 comments (0 inline, 0 general)
src/network/network.cpp
Show inline comments
 
@@ -598,7 +598,7 @@ public:
 
	{
 
		_networking = true;
 
		new ClientNetworkGameSocketHandler(s);
 
		MyClient::SendCompanyInformationQuery();
 
		MyClient::SendInformationQuery();
 
	}
 
};
 

	
src/network/network_client.cpp
Show inline comments
 
@@ -27,6 +27,7 @@
 
#include "network.h"
 
#include "network_base.h"
 
#include "network_client.h"
 
#include "network_gamelist.h"
 
#include "../core/backup_type.hpp"
 
#include "../thread.h"
 

	
 
@@ -341,15 +342,18 @@ static_assert(NETWORK_SERVER_ID_LENGTH =
 
 *   DEF_CLIENT_SEND_COMMAND has no parameters
 
 ************/
 

	
 
/** Query the server for company information. */
 
NetworkRecvStatus ClientNetworkGameSocketHandler::SendCompanyInformationQuery()
 
/**
 
 * Query the server for server information.
 
 */
 
NetworkRecvStatus ClientNetworkGameSocketHandler::SendInformationQuery()
 
{
 
	my_client->status = STATUS_COMPANY_INFO;
 
	_network_join_status = NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO;
 
	SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
 

	
 
	Packet *p = new Packet(PACKET_CLIENT_COMPANY_INFO);
 
	my_client->SendPacket(p);
 
	my_client->SendPacket(new Packet(PACKET_CLIENT_GAME_INFO));
 
	my_client->SendPacket(new Packet(PACKET_CLIENT_COMPANY_INFO));
 

	
 
	return NETWORK_RECV_STATUS_OKAY;
 
}
 

	
 
@@ -571,6 +575,28 @@ NetworkRecvStatus ClientNetworkGameSocke
 
	return NETWORK_RECV_STATUS_SERVER_BANNED;
 
}
 

	
 
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p)
 
{
 
	if (this->status != STATUS_COMPANY_INFO && this->status != STATUS_INACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
 

	
 
	NetworkGameList *item = GetLobbyGameInfo();
 

	
 
	/* Clear any existing GRFConfig chain. */
 
	ClearGRFConfigList(&item->info.grfconfig);
 
	/* Retrieve the NetworkGameInfo from the packet. */
 
	DeserializeNetworkGameInfo(p, &item->info);
 
	/* Check for compatability with the client. */
 
	CheckGameCompatibility(item->info);
 
	/* Ensure we consider the server online. */
 
	item->online = true;
 

	
 
	SetWindowDirty(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY);
 

	
 
	/* We will receive company info next, so keep connection open. */
 
	if (this->status == STATUS_COMPANY_INFO) return NETWORK_RECV_STATUS_OKAY;
 
	return NETWORK_RECV_STATUS_CLOSE_QUERY;
 
}
 

	
 
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_INFO(Packet *p)
 
{
 
	if (this->status != STATUS_COMPANY_INFO) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
src/network/network_client.h
Show inline comments
 
@@ -43,6 +43,7 @@ protected:
 
	NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override;
 
	NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override;
 
	NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override;
 
	NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p) override;
 
	NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet *p) override;
 
	NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p) override;
 
	NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p) override;
 
@@ -79,7 +80,7 @@ public:
 
	NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override;
 
	void ClientError(NetworkRecvStatus res);
 

	
 
	static NetworkRecvStatus SendCompanyInformationQuery();
 
	static NetworkRecvStatus SendInformationQuery();
 

	
 
	static NetworkRecvStatus SendJoin();
 
	static NetworkRecvStatus SendCommand(const CommandPacket *cp);
src/network/network_gui.cpp
Show inline comments
 
@@ -1482,10 +1482,10 @@ struct NetworkLobbyWindow : public Windo
 
				break;
 

	
 
			case WID_NL_REFRESH:  // Refresh
 
				NetworkTCPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); // company info
 
				NetworkUDPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); // general data
 
				/* Clear the information so removed companies don't remain */
 
				for (auto &company : this->company_info) company = {};
 

	
 
				NetworkTCPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port));
 
				break;
 
		}
 
	}
 
@@ -1553,8 +1553,7 @@ static void ShowNetworkLobbyWindow(Netwo
 
	DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_START);
 
	DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_GAME);
 

	
 
	NetworkTCPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); // company info
 
	NetworkUDPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port)); // general data
 
	NetworkTCPQueryServer(NetworkAddress(_settings_client.network.last_host, _settings_client.network.last_port));
 

	
 
	new NetworkLobbyWindow(&_network_lobby_window_desc, ngl);
 
}
 
@@ -1570,6 +1569,16 @@ NetworkCompanyInfo *GetLobbyCompanyInfo(
 
	return (lobby != nullptr && company < MAX_COMPANIES) ? &lobby->company_info[company] : nullptr;
 
}
 

	
 
/**
 
 * Get the game information for the lobby.
 
 * @return the game info struct to write the (downloaded) data to.
 
 */
 
NetworkGameList *GetLobbyGameInfo()
 
{
 
	NetworkLobbyWindow *lobby = dynamic_cast<NetworkLobbyWindow *>(FindWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY));
 
	return lobby != nullptr ? lobby->server : nullptr;
 
}
 

	
 
/* The window below gives information about the connected clients
 
 * and also makes able to kick them (if server) and stuff like that. */
 

	
src/network/network_gui.h
Show inline comments
 
@@ -15,6 +15,7 @@
 
#include "../economy_type.h"
 
#include "../window_type.h"
 
#include "network_type.h"
 
#include "network_gamelist.h"
 

	
 
void ShowNetworkNeedPassword(NetworkPasswordType npt);
 
void ShowNetworkChatQueryWindow(DestType type, int dest);
 
@@ -37,5 +38,6 @@ struct NetworkCompanyInfo : NetworkCompa
 
};
 

	
 
NetworkCompanyInfo *GetLobbyCompanyInfo(CompanyID company);
 
NetworkGameList *GetLobbyGameInfo();
 

	
 
#endif /* NETWORK_GUI_H */
0 comments (0 inline, 0 general)