fixed network crashes

This commit is contained in:
Dave White 2005-03-21 01:33:36 +00:00
parent cbb5808957
commit 222adf9ee6
2 changed files with 20 additions and 7 deletions

View file

@ -1,12 +1,12 @@
#include "global.hpp"
#include "serialization/binary_wml.hpp"
#include "config.hpp"
#include "log.hpp"
#include "network.hpp"
#include "network_worker.hpp"
#include "util.hpp"
#include "wassert.hpp"
#include "serialization/binary_wml.hpp"
#include "SDL_net.h"
@ -101,6 +101,7 @@ void check_error()
}
SDLNet_SocketSet socket_set = 0;
std::set<network::connection> waiting_sockets;
typedef std::vector<network::connection> sockets_list;
sockets_list sockets;
@ -184,6 +185,7 @@ manager::~manager()
worker_pool_man = NULL;
SDLNet_FreeSocketSet(socket_set);
socket_set = 0;
waiting_sockets.clear();
SDLNet_Quit();
}
}
@ -270,6 +272,8 @@ connection connect(const std::string& host, int port)
throw network::error("Could not add socket to socket set");
}
waiting_sockets.insert(connect);
sockets.push_back(connect);
wassert(schemas.count(connect) == 0);
schemas.insert(std::pair<network::connection,schema_pair>(connect,schema_pair()));
@ -349,6 +353,7 @@ connection accept_connection()
throw network::error("Could not add socket to socket set");
}
const connection connect = create_connection(sock,"",0);
//send back their connection number
@ -359,6 +364,7 @@ connection accept_connection()
throw network::error("Could not send initial handshake");
}
waiting_sockets.insert(connect);
sockets.push_back(connect);
wassert(schemas.count(connect) == 0);
schemas.insert(std::pair<network::connection,schema_pair>(connect,schema_pair()));
@ -398,6 +404,7 @@ void disconnect(connection s)
const TCPsocket sock = get_socket(s);
waiting_sockets.erase(s);
SDLNet_TCP_DelSocket(socket_set,sock);
SDLNet_TCP_Close(sock);
@ -459,7 +466,7 @@ connection receive_data(config& cfg, connection connection_num)
const int res = SDLNet_CheckSockets(socket_set,0);
for(sockets_list::const_iterator i = sockets.begin(); res != 0 && i != sockets.end(); ++i) {
for(std::set<network::connection>::iterator i = waiting_sockets.begin(); res != 0 && i != waiting_sockets.end(); ) {
connection_details& details = get_connection_details(*i);
const TCPsocket sock = details.sock;
if(SDLNet_SocketReady(sock)) {
@ -479,8 +486,11 @@ connection receive_data(config& cfg, connection connection_num)
continue;
}
network_worker_pool::receive_data(sock);
waiting_sockets.erase(i++);
SDLNet_TCP_DelSocket(socket_set,sock);
network_worker_pool::receive_data(sock);
} else {
++i;
}
}
@ -502,13 +512,15 @@ connection receive_data(config& cfg, connection connection_num)
}
if(result == 0) {
assert(false);
return result;
}
waiting_sockets.insert(result);
const schema_map::iterator schema = schemas.find(result);
wassert(schema != schemas.end());
read_compressed(cfg, std::string(buf.begin(), buf.end()), schema->second.incoming);
read_compressed(cfg,std::string(buf.begin(),buf.end()),schema->second.incoming);
return result;
}
@ -556,7 +568,7 @@ void send_data(const config& cfg, connection connection_num, size_t max_size, SE
const schema_map::iterator schema = schemas.find(connection_num);
wassert(schema != schemas.end());
const std::string& value = write_compressed(cfg, schema->second.outgoing);
const std::string& value = write_compressed(cfg,schema->second.outgoing);
// std::cerr << "--- SEND DATA to " << ((int)connection_num) << ": '"
// << cfg.write() << "'\n--- END SEND DATA\n";

View file

@ -213,7 +213,6 @@ manager::~manager()
{
const threading::lock lock(*global_mutex);
managed = false;
sockets_locked.clear();
socket_errors = 0;
}
cond->notify_all();
@ -231,6 +230,8 @@ manager::~manager()
global_mutex = NULL;
cond = NULL;
sockets_locked.clear();
LOG_NW << "exiting manager::~manager()\n";
}
}
@ -362,4 +363,4 @@ std::pair<int,int> get_current_transfer_stats()
return current_transfer_stats;
}
}
}