fix ending proxy session on non-virtual connections
This commit is contained in:
+6
-7
@@ -23,7 +23,9 @@
|
|||||||
#include <phosg/Strings.hh>
|
#include <phosg/Strings.hh>
|
||||||
#include <phosg/Time.hh>
|
#include <phosg/Time.hh>
|
||||||
|
|
||||||
|
#include "IPStackSimulator.hh"
|
||||||
#include "Loggers.hh"
|
#include "Loggers.hh"
|
||||||
|
#include "NetworkAddresses.hh"
|
||||||
#include "PSOProtocol.hh"
|
#include "PSOProtocol.hh"
|
||||||
#include "ProxyCommands.hh"
|
#include "ProxyCommands.hh"
|
||||||
#include "ReceiveCommands.hh"
|
#include "ReceiveCommands.hh"
|
||||||
@@ -739,22 +741,19 @@ void ProxyServer::LinkedSession::send_to_game_server(const char* error_message)
|
|||||||
S_Reconnect_19 reconnect_cmd = {{0, s->name_to_port_config.at(port_name)->port, 0}};
|
S_Reconnect_19 reconnect_cmd = {{0, s->name_to_port_config.at(port_name)->port, 0}};
|
||||||
|
|
||||||
// If the client is on a virtual connection, we can use any address
|
// If the client is on a virtual connection, we can use any address
|
||||||
// here and they should be able to connect back to the game server. If
|
// here and they should be able to connect back to the game server
|
||||||
// the client is on a real connection, we'll use the sockname of the
|
|
||||||
// existing connection (like we do in the server 19 command handler).
|
|
||||||
if (this->client_channel.is_virtual_connection) {
|
if (this->client_channel.is_virtual_connection) {
|
||||||
struct sockaddr_in* dest_sin = reinterpret_cast<struct sockaddr_in*>(&this->next_destination);
|
struct sockaddr_in* dest_sin = reinterpret_cast<struct sockaddr_in*>(&this->next_destination);
|
||||||
if (dest_sin->sin_family != AF_INET) {
|
if (dest_sin->sin_family != AF_INET) {
|
||||||
throw logic_error("ss not AF_INET");
|
throw logic_error("ss not AF_INET");
|
||||||
}
|
}
|
||||||
reconnect_cmd.address.store_raw(dest_sin->sin_addr.s_addr);
|
reconnect_cmd.address = IPStackSimulator::connect_address_for_remote_address(ntohl(dest_sin->sin_addr.s_addr));
|
||||||
} else {
|
} else {
|
||||||
const struct sockaddr_in* sin = reinterpret_cast<const struct sockaddr_in*>(
|
const struct sockaddr_in* sin = reinterpret_cast<const struct sockaddr_in*>(&this->client_channel.remote_addr);
|
||||||
&this->client_channel.local_addr);
|
|
||||||
if (sin->sin_family != AF_INET) {
|
if (sin->sin_family != AF_INET) {
|
||||||
throw logic_error("existing connection is not ipv4");
|
throw logic_error("existing connection is not ipv4");
|
||||||
}
|
}
|
||||||
reconnect_cmd.address.store_raw(sin->sin_addr.s_addr);
|
reconnect_cmd.address = is_local_address(ntohl(sin->sin_addr.s_addr)) ? s->local_address : s->external_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->client_channel.send(0x19, 0x00, &reconnect_cmd, sizeof(reconnect_cmd));
|
this->client_channel.send(0x19, 0x00, &reconnect_cmd, sizeof(reconnect_cmd));
|
||||||
|
|||||||
@@ -84,11 +84,13 @@ static shared_ptr<const Menu> proxy_options_menu_for_client(shared_ptr<const Cli
|
|||||||
"Red name", "Set the colors\nof your name and\nChallenge Mode\nrank to red");
|
"Red name", "Set the colors\nof your name and\nChallenge Mode\nrank to red");
|
||||||
add_option(ProxyOptionsMenuItemID::BLANK_NAME, Client::Flag::PROXY_BLANK_NAME_ENABLED,
|
add_option(ProxyOptionsMenuItemID::BLANK_NAME, Client::Flag::PROXY_BLANK_NAME_ENABLED,
|
||||||
"Blank name", "Suppress your\ncharacter name\nduring login");
|
"Blank name", "Suppress your\ncharacter name\nduring login");
|
||||||
|
if (c->version() != GameVersion::XB) {
|
||||||
add_option(ProxyOptionsMenuItemID::SUPPRESS_LOGIN, Client::Flag::PROXY_SUPPRESS_REMOTE_LOGIN,
|
add_option(ProxyOptionsMenuItemID::SUPPRESS_LOGIN, Client::Flag::PROXY_SUPPRESS_REMOTE_LOGIN,
|
||||||
"Skip login", "Use an alternate\nlogin sequence");
|
"Skip login", "Use an alternate\nlogin sequence");
|
||||||
add_option(ProxyOptionsMenuItemID::SKIP_CARD, Client::Flag::PROXY_ZERO_REMOTE_GUILD_CARD,
|
add_option(ProxyOptionsMenuItemID::SKIP_CARD, Client::Flag::PROXY_ZERO_REMOTE_GUILD_CARD,
|
||||||
"Skip card", "Use an alternate\nvalue for your initial\nGuild Card");
|
"Skip card", "Use an alternate\nvalue for your initial\nGuild Card");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user