attempt to fix networking problems
This commit is contained in:
parent
769c02fb38
commit
d391af101b
4 changed files with 75 additions and 62 deletions
|
@ -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]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue