From 3a7d0ad85f0c9ccc57aeb8e392a7021dc7cc87d1 Mon Sep 17 00:00:00 2001 From: Dave White Date: Sun, 12 Oct 2003 09:23:59 +0000 Subject: [PATCH] fixed problem where restarting a network game... ...after already playing one doesn't work properly --- src/multiplayer.cpp | 14 +++++++++----- src/multiplayer.hpp | 2 +- src/multiplayer_client.cpp | 29 ++++++++++++++++++++++++----- src/network.cpp | 27 ++++++++++++++++++++++----- src/network.hpp | 11 +++++++++-- src/preferences.cpp | 1 - 6 files changed, 65 insertions(+), 19 deletions(-) diff --git a/src/multiplayer.cpp b/src/multiplayer.cpp index b7dd850cbab..1919aa5b3ae 100644 --- a/src/multiplayer.cpp +++ b/src/multiplayer.cpp @@ -57,6 +57,9 @@ connection_acceptor::connection_acceptor(config& players) positions_[*i] = 0; } } + + //if we have any connected players when we are created, send them the data + network::send_data(players_); } int connection_acceptor::do_action() @@ -157,8 +160,7 @@ int connection_acceptor::do_action() << "\n"; } } else { - std::cerr << "tried to take unknown side: " << side_taken - << "\n"; + std::cerr << "tried to take unknown side: " << side_taken << "\n"; } return CONNECTIONS_PART_FILLED; @@ -211,9 +213,11 @@ bool accept_network_connections(display& disp, config& players) } -void play_multiplayer(display& disp, game_data& units_data, config& cfg, - game_state& state) +void play_multiplayer(display& disp, game_data& units_data, config cfg, + game_state& state, bool server) { + log_scope("play multiplayer"); + std::vector options; std::vector& levels = cfg.children["multiplayer"]; for(std::vector::iterator i = levels.begin(); i!=levels.end();++i){ @@ -325,7 +329,7 @@ void play_multiplayer(display& disp, game_data& units_data, config& cfg, } const network::manager net_manager; - const network::server_manager server_man; + const network::server_manager server_man(15000,server); const bool network_state = accept_network_connections(disp,level); if(network_state == false) diff --git a/src/multiplayer.hpp b/src/multiplayer.hpp index 864a61ceda9..a6cebb295c2 100644 --- a/src/multiplayer.hpp +++ b/src/multiplayer.hpp @@ -23,6 +23,6 @@ void play_multiplayer_client(display& disp, game_data& units_data, config& cfg, game_state& state); void play_multiplayer(display& disp, game_data& units_data, - config& cfg, game_state& state); + config cfg, game_state& state, bool server=true); #endif diff --git a/src/multiplayer_client.cpp b/src/multiplayer_client.cpp index 0631775b0c5..a0c7dc64776 100644 --- a/src/multiplayer_client.cpp +++ b/src/multiplayer_client.cpp @@ -1,4 +1,5 @@ #include "language.hpp" +#include "log.hpp" #include "multiplayer.hpp" #include "multiplayer_client.hpp" #include "playlevel.hpp" @@ -51,7 +52,19 @@ GAME_LIST_RESULT manage_game_list(display& disp, const config* gamelist) if(res == gamelist_manager::UPDATED_GAMELIST) { gamelist = manager.get_gamelist(); } else if(res == 0) { - return CREATE_GAME; + std::string name; + const int res = gui::show_dialog(disp,NULL,"","Name your game:", + gui::OK_CANCEL,NULL,NULL,"Name:",&name); + if(res == 0) { + config response; + config create_game; + create_game["name"] = name; + response.children["create_game"].push_back( + new config(create_game)); + network::send_data(response); + + return CREATE_GAME; + } } else if(size_t(res) == options.size()-1) { return QUIT_GAME; } else if(res > 0 && size_t(res) < options.size()) { @@ -77,6 +90,8 @@ GAME_LIST_RESULT manage_game_list(display& disp, const config* gamelist) void play_multiplayer_client(display& disp, game_data& units_data, config& cfg, game_state& state) { + log_scope("playing multiplayer client"); + const network::manager net_manager; std::string host; @@ -103,13 +118,17 @@ void play_multiplayer_client(display& disp, game_data& units_data, config& cfg, if(gamelist != NULL) { const GAME_LIST_RESULT res = manage_game_list(disp,gamelist); switch(res) { - case QUIT_GAME: + case QUIT_GAME: { return; - case CREATE_GAME: - play_multiplayer(disp,units_data,cfg,state); + } + case CREATE_GAME: { + std::cerr << "playing multiplayer...\n"; + play_multiplayer(disp,units_data,cfg,state,false); return; - case JOIN_GAME: + } + case JOIN_GAME: { break; + } } for(;;) { diff --git a/src/network.cpp b/src/network.cpp index 6b3a0b9ee20..83d40e1dd6c 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -21,8 +21,14 @@ TCPsocket server_socket; namespace network { -manager::manager() +manager::manager() : free_(true) { + //if the network is already being managed + if(socket_set) { + free_ = false; + return; + } + if(SDLNet_Init() == -1) { throw error(SDL_GetError()); } @@ -34,20 +40,23 @@ manager::~manager() { disconnect(); SDLNet_FreeSocketSet(socket_set); + socket_set = 0; SDLNet_Quit(); } server_manager::server_manager(int port, bool create_server) + : free_(false) { - if(create_server) { + if(create_server && !server_socket) { server_socket = connect("",port); std::cerr << "server socket initialized: " << server_socket << "\n"; + free_ = true; } } server_manager::~server_manager() { - if(server_socket) { + if(free_) { SDLNet_TCP_Close(server_socket); server_socket = 0; } @@ -89,7 +98,9 @@ connection connect(const std::string& host, int port) connection accept_connection() { - assert(server_socket); + if(!server_socket) + return 0; + const connection sock = SDLNet_TCP_Accept(server_socket); if(sock) { const int res = SDLNet_TCP_AddSocket(socket_set,sock); @@ -124,6 +135,11 @@ void disconnect(connection s) sockets.erase(i); SDLNet_TCP_DelSocket(socket_set,s); SDLNet_TCP_Close(s); + } else { + std::cerr << "Could not find socket to close: " << (int)s << "\n"; + if(sockets.size() == 1) { + std::cerr << "valid socket: " << (int)*sockets.begin() << "\n"; + } } } @@ -164,6 +180,7 @@ connection receive_data(config& cfg, connection connection_num, int timeout) } if(buffer == "") { + std::cerr << "error receiving data: " << (int)*i << "\n"; throw error("error receiving data",*i); } @@ -195,7 +212,7 @@ connection receive_data(config& cfg, connection connection_num, int timeout) return 0; } -void send_data(config& cfg, connection connection_num) +void send_data(const config& cfg, connection connection_num) { log_scope("sending data"); if(!connection_num) { diff --git a/src/network.hpp b/src/network.hpp index 3bd87dd4259..12d195ca7c8 100644 --- a/src/network.hpp +++ b/src/network.hpp @@ -12,11 +12,17 @@ namespace network { struct manager { manager(); ~manager(); + +private: + bool free_; }; struct server_manager { server_manager(int port=15000, bool create_server=true); ~server_manager(); + +private: + bool free_; }; typedef TCPsocket connection; @@ -29,11 +35,12 @@ void disconnect(connection connection_num=0); connection receive_data(config& cfg, connection connection_num=0, int tout=0); -void send_data(config& cfg, connection connection_num=0); +void send_data(const config& cfg, connection connection_num=0); struct error { - error(const std::string& msg, connection sock=0) : message(msg) {} + error(const std::string& msg, connection sock=0) + : message(msg), socket(sock) {} std::string message; connection socket; diff --git a/src/preferences.cpp b/src/preferences.cpp index 0e124612936..c2e4c78d95a 100644 --- a/src/preferences.cpp +++ b/src/preferences.cpp @@ -344,7 +344,6 @@ void show_preferences_dialog(display& disp) bool redraw_all = true; for(;;) { - log_scope("looping"); int mousex, mousey; const int mouse_flags = SDL_GetMouseState(&mousex,&mousey);