server: remember client's ip in player_connections_ and use it in remove_player()

this is needed so ip is properly logged even if socket is closed or invalid
This commit is contained in:
loonycyborg 2018-06-04 13:16:58 +03:00
parent 4b7a6a98ec
commit aaabbf2687
2 changed files with 9 additions and 2 deletions

View file

@ -38,9 +38,12 @@ class player_record
mutable player player_;
std::shared_ptr<game> game_;
std::string ip_address;
public:
const socket_ptr socket() const { return socket_; }
std::string saved_client_ip() const { return ip_address; }
player& info() const { return player_; }
const std::string& name() const { return player_.name(); }
const std::shared_ptr<game> get_game() const;
@ -49,7 +52,7 @@ class player_record
static void set_game(player_record&, std::shared_ptr<game>);
static void enter_lobby(player_record&);
player_record(const socket_ptr socket, const player& player) : socket_(socket), player_(player) {}
player_record(const socket_ptr socket, const player& player) : socket_(socket), player_(player), ip_address(client_address(socket)) {}
};
struct socket_t{};

View file

@ -1852,11 +1852,15 @@ void send_server_message(socket_ptr socket, const std::string& message)
void server::remove_player(socket_ptr socket)
{
std::string ip = client_address(socket);
std::string ip;
auto iter = player_connections_.find(socket);
if(iter == player_connections_.end()) {
return;
} else {
// client_address() is very likely to return <unknown address> at this point
// so we remember ip in player_connections_
ip = iter->saved_client_ip();
}
const std::shared_ptr<game> g = iter->get_game();