attempt to fix networking problems

This commit is contained in:
uid68803 2003-12-30 22:47:11 +00:00
parent 769c02fb38
commit d391af101b
4 changed files with 75 additions and 62 deletions

View file

@ -13,13 +13,38 @@
[side] [side]
side=1 side=1
enemy=2 enemy=2,3,4,5,6
canrecruit=1 canrecruit=1
controller=human controller=human
[/side] [/side]
[side] [side]
side=2 side=2
enemy=1 enemy=1,3,4,5,6
canrecruit=1
controller=human
[/side]
[side]
side=3
enemy=1,2,4,5,6
canrecruit=1
controller=human
[/side]
[side]
side=4
enemy=1,2,3,5,6
canrecruit=1
controller=human
[/side]
[side]
side=5
enemy=1,2,3,4,6
canrecruit=1
controller=human
[/side]
[side]
side=6
enemy=1,2,3,4,5
canrecruit=1 canrecruit=1
controller=human controller=human
[/side] [/side]

View file

@ -1,12 +1,12 @@
[map_generator] [map_generator]
name=default name=default
width=40 width=60
height=40 height=60
iterations=1000 iterations=1000
hill_size=10 hill_size=10
max_lakes=40 max_lakes=40
villages=300 villages=800
players=2 players=6
min_lake_height=500 min_lake_height=500
lake_size=150 lake_size=150
river_frequency=20 river_frequency=20

View file

@ -544,11 +544,8 @@ std::string generate_map(size_t width, size_t height,
//in 'valid_terrain'. //in 'valid_terrain'.
int ntries = 0; int ntries = 0;
bool placing_bad = true; bool placing_bad = true;
while(placing_bad) { const size_t max_tries = 50000;
if(++ntries > 5000) { while(placing_bad && ntries++ < max_tries) {
std::cerr << "could not sanely place castles. Aborting.\n";
return "";
}
std::vector<location> castles; std::vector<location> castles;
for(size_t player = 0; player != nplayers; ++player) { for(size_t player = 0; player != nplayers; ++player) {
@ -582,7 +579,7 @@ std::string generate_map(size_t width, size_t height,
} }
} }
if(placing_bad) if(placing_bad && ntries < max_tries)
continue; continue;
//make sure all castles are a minimum distance away from each other //make sure all castles are a minimum distance away from each other
@ -596,7 +593,7 @@ std::string generate_map(size_t width, size_t height,
} }
} }
if(placing_bad) if(placing_bad && ntries < max_tries)
continue; continue;
//plonk down the castles. //plonk down the castles.

View file

@ -14,7 +14,13 @@ SDLNet_SocketSet socket_set = 0;
typedef std::vector<network::connection> sockets_list; typedef std::vector<network::connection> sockets_list;
sockets_list sockets; sockets_list sockets;
std::map<network::connection,std::string> received_data; struct partial_buffer {
partial_buffer() : upto(0) {}
std::vector<char> buf;
size_t upto;
};
std::map<network::connection,partial_buffer> received_data;
TCPsocket server_socket; TCPsocket server_socket;
@ -181,10 +187,13 @@ connection receive_data(config& cfg, connection connection_num, int timeout)
for(sockets_list::const_iterator i = sockets.begin(); i != sockets.end(); ++i) { for(sockets_list::const_iterator i = sockets.begin(); i != sockets.end(); ++i) {
if(SDLNet_SocketReady(*i)) { if(SDLNet_SocketReady(*i)) {
std::map<connection,partial_buffer>::iterator part_received = received_data.find(*i);
if(part_received == received_data.end()) {
char num_buf[4]; char num_buf[4];
size_t len = SDLNet_TCP_Recv(*i,num_buf,4); size_t len = SDLNet_TCP_Recv(*i,num_buf,4);
if(len != 4) { if(len != 4) {
std::cerr << "received bad packet length: " << len << "/4\n";
throw error(std::string("network error receiving length data: ") + SDLNet_GetError(),*i); throw error(std::string("network error receiving length data: ") + SDLNet_GetError(),*i);
} }
@ -196,49 +205,31 @@ connection receive_data(config& cfg, connection connection_num, int timeout)
throw error(std::string("network error: bad length data"),*i); throw error(std::string("network error: bad length data"),*i);
} }
std::vector<char> v(len); part_received = received_data.insert(std::pair<connection,partial_buffer>(*i,partial_buffer())).first;
const size_t nbytes = SDLNet_TCP_Recv(*i,&v[0],len); part_received->second.buf.resize(len);
if(nbytes != len) { }
partial_buffer& buf = part_received->second;
const size_t expected = buf.buf.size() - buf.upto;
const size_t nbytes = SDLNet_TCP_Recv(*i,&buf.buf[buf.upto],expected);
if(nbytes > expected) {
std::cerr << "received " << nbytes << "/" << expected << "\n";
throw error(std::string("network error: received wrong number of bytes: ") + SDLNet_GetError(),*i); throw error(std::string("network error: received wrong number of bytes: ") + SDLNet_GetError(),*i);
} }
std::string buffer(v.begin(),v.end()); buf.upto += nbytes;
/* std::cerr << "received " << nbytes << "=" << buf.upto << "/" << buf.buf.size() << "\n";
for(;;) {
char c;
const int len = SDLNet_TCP_Recv(*i,&c,1);
if(len == 0) { if(buf.upto == buf.buf.size()) {
break; const std::string buffer(buf.buf.begin(),buf.buf.end());
} else if(len < 0) { received_data.erase(part_received); //invalidates buf. don't use again
throw error(std::string("error receiving data: ") + SDLNet_GetError(),*i);
}
buffer.resize(buffer.size()+1);
buffer[buffer.size()-1] = c;
if(c == 0) {
break;
}
}
*/
if(buffer == "") { if(buffer == "") {
throw error("remote host closed connection",*i); throw error("remote host closed connection",*i);
} }
if(buffer[buffer.size()-1] != 0) { if(buffer[buffer.size()-1] != 0) {
received_data[*i] += buffer; throw network::error("sanity check on incoming data failed",*i);
const int ticks_taken = SDL_GetTicks() - starting_ticks;
if(ticks_taken < timeout) {
return receive_data(cfg,connection_num,timeout-ticks_taken);
} else {
return 0;
}
} else {
const std::map<connection,std::string>::iterator it = received_data.find(*i);
if(it != received_data.end()) {
buffer = it->second + buffer;
received_data.erase(it);
} }
cfg.read(buffer); cfg.read(buffer);