mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r186) -Add: debug 'net' for network debug (sign_de)
-Fix: desync problem (server was not waiting for clients) (sign_de)
This commit is contained in:
parent
0a04fe95c9
commit
157e90b49f
|
@ -130,6 +130,7 @@ void NetworkShutdown();
|
|||
void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback);
|
||||
void NetworkStartSync(bool fcreset);
|
||||
void NetworkClose(bool client);
|
||||
void NetworkSendReadyPacket();
|
||||
|
||||
void NetworkIPListInit();
|
||||
|
||||
|
|
|
@ -1242,6 +1242,7 @@ STR_NETWORK_ERR_NOCONNECTION :{WHITE} The server didn't answer the request
|
|||
STR_NETWORK_ERR_DESYNC :{WHITE} Network-Game synchronization failed.
|
||||
STR_NETWORK_ERR_LOSTCONNECTION :{WHITE} Network-Game connection lost.
|
||||
STR_NETWORK_ERR_SAVEGAMEERROR :{WHITE} Could not load server-savegame.
|
||||
STR_NETWORK_ERR_TIMEOUT :{WHITE} Connection #{NUMU16} timed out.
|
||||
|
||||
############ end network gui strings
|
||||
|
||||
|
|
195
network.c
195
network.c
|
@ -116,6 +116,11 @@ typedef struct AckPacket {
|
|||
byte packet_type;
|
||||
} AckPacket;
|
||||
|
||||
typedef struct ReadyPacket {
|
||||
byte packet_length;
|
||||
byte packet_type;
|
||||
} ReadyPacket;
|
||||
|
||||
typedef struct FilePacketHdr {
|
||||
byte packet_length;
|
||||
byte packet_type;
|
||||
|
@ -142,6 +147,8 @@ typedef struct ClientState {
|
|||
int socket;
|
||||
bool inactive; // disable sending of commands/syncs to client
|
||||
bool writable;
|
||||
bool ready;
|
||||
uint timeout;
|
||||
uint xmitpos;
|
||||
|
||||
uint eaten;
|
||||
|
@ -183,6 +190,8 @@ static int _num_clients;
|
|||
|
||||
// keep a history of the 16 most recent seeds to be able to capture out of sync errors.
|
||||
static uint32 _my_seed_list[16][2];
|
||||
static bool _network_ready_sent;
|
||||
static uint32 _network_client_timeout;
|
||||
|
||||
typedef struct FutureSeeds {
|
||||
int32 frame;
|
||||
|
@ -246,6 +255,7 @@ typedef struct NetworkGameList {
|
|||
static NetworkGameInfo _network_game;
|
||||
static NetworkGameList * _network_game_list = NULL;
|
||||
|
||||
|
||||
/* multi os compatible sleep function */
|
||||
void CSleep(int milliseconds) {
|
||||
#if defined(WIN32)
|
||||
|
@ -287,30 +297,33 @@ usleep(milliseconds*1000);
|
|||
// * Network Error Handlers * //
|
||||
// ****************************** //
|
||||
|
||||
static void NetworkHandleSaveGameError() {
|
||||
static void NetworkHandleSaveGameError()
|
||||
{
|
||||
_networking_sync = false;
|
||||
_networking_queuing = true;
|
||||
_switch_mode = SM_MENU;
|
||||
_switch_mode_errorstr = STR_NETWORK_ERR_SAVEGAMEERROR;
|
||||
}
|
||||
|
||||
static void NetworkHandleConnectionLost() {
|
||||
static void NetworkHandleConnectionLost()
|
||||
{
|
||||
_networking_sync = false;
|
||||
_networking_queuing = true;
|
||||
_switch_mode = SM_MENU;
|
||||
_switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION;
|
||||
}
|
||||
static void NetworkHandleDeSync() {
|
||||
printf("fatal error: network sync error at frame %i\n",_frame_counter);
|
||||
{
|
||||
int i;
|
||||
for (i=15; i>=0; i--) printf("frame %i: [0]=%i, [1]=%i\n",_frame_counter-(i+1),_my_seed_list[i][0],_my_seed_list[i][1]);
|
||||
for (i=0; i<8; i++) printf("frame %i: [0]=%i, [1]=%i\n",_frame_counter+i,_future_seed[i].seed[0],_future_seed[i].seed[1]);
|
||||
}
|
||||
_networking_sync = false;
|
||||
_networking_queuing = true;
|
||||
_switch_mode = SM_MENU;
|
||||
_switch_mode_errorstr = STR_NETWORK_ERR_DESYNC;
|
||||
static void NetworkHandleDeSync()
|
||||
{
|
||||
DEBUG(net, 0) ("[NET] Fatal ERROR: network sync error at frame %i", _frame_counter);
|
||||
{
|
||||
int i;
|
||||
for (i=15; i>=0; i--) DEBUG(net,0) ("[NET] frame %i: [0]=%i, [1]=%i",_frame_counter-(i+1),_my_seed_list[i][0],_my_seed_list[i][1]);
|
||||
for (i=0; i<8; i++) DEBUG(net,0) ("[NET] frame %i: [0]=%i, [1]=%i",_frame_counter+i,_future_seed[i].seed[0],_future_seed[i].seed[1]);
|
||||
}
|
||||
_networking_sync = false;
|
||||
_networking_queuing = true;
|
||||
_switch_mode = SM_MENU;
|
||||
_switch_mode_errorstr = STR_NETWORK_ERR_DESYNC;
|
||||
}
|
||||
|
||||
// ****************************** //
|
||||
|
@ -343,12 +356,13 @@ void NetworkProcessCommands()
|
|||
if (!(nq->head = qp->next)) nq->last = &nq->head;
|
||||
|
||||
if (qp->frame < _frame_counter && _networking_sync) {
|
||||
error("!qp->cp.frame < _frame_counter, %d < %d\n", qp->frame, _frame_counter);
|
||||
DEBUG(net,0) ("error: !qp->cp.frame < _frame_counter, %d < %d\n", qp->frame, _frame_counter);
|
||||
}
|
||||
|
||||
// run the command
|
||||
_current_player = qp->cp.player;
|
||||
memcpy(_decode_parameters, qp->cp.dp, (qp->cp.packet_length - COMMAND_PACKET_BASE_SIZE));
|
||||
|
||||
DoCommandP(qp->cp.tile, qp->cp.p1, qp->cp.p2, qp->callback, qp->cmd | CMD_DONT_NETWORK);
|
||||
free(qp);
|
||||
}
|
||||
|
@ -466,7 +480,7 @@ static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
|
|||
ClientState *c;
|
||||
AckPacket ap;
|
||||
|
||||
printf("net: cmd size %d\n", np->packet_length);
|
||||
DEBUG(net, 2) ("[NET] cmd size %d", np->packet_length);
|
||||
|
||||
assert(np->packet_length >= COMMAND_PACKET_BASE_SIZE);
|
||||
|
||||
|
@ -515,7 +529,8 @@ static void HandleSyncPacket(SyncPacket *sp)
|
|||
_frame_counter_srv = _frame_counter_max - sp->server;
|
||||
_frame_counter_max += sp->frames;
|
||||
|
||||
printf("net: sync max=%d cur=%d server=%d\n", _frame_counter_max, _frame_counter, _frame_counter_srv);
|
||||
// reset network ready packet state
|
||||
_network_ready_sent = false;
|
||||
|
||||
// queueing only?
|
||||
if (_networking_queuing || _frame_counter == 0)
|
||||
|
@ -524,6 +539,8 @@ static void HandleSyncPacket(SyncPacket *sp)
|
|||
s1 = TO_LE32(sp->random_seed_1);
|
||||
s2 = TO_LE32(sp->random_seed_2);
|
||||
|
||||
DEBUG(net, 2) ("[NET] sync seeds: [1]=%i rnd[2]=%i", sp->random_seed_1, sp->random_seed_2);
|
||||
|
||||
if (_frame_counter_srv <= _frame_counter) {
|
||||
// we are ahead of the server check if the seed is in our list.
|
||||
if (_frame_counter_srv + 16 > _frame_counter) {
|
||||
|
@ -556,7 +573,7 @@ static void HandleAckPacket()
|
|||
*_command_queue.last = q;
|
||||
_command_queue.last = &q->next;
|
||||
|
||||
printf("net: ack\n");
|
||||
DEBUG(net, 2) ("[NET] ack");
|
||||
}
|
||||
|
||||
static void HandleFilePacket(FilePacketHdr *fp)
|
||||
|
@ -605,7 +622,7 @@ static void CloseClient(ClientState *cs)
|
|||
{
|
||||
Packet *p, *next;
|
||||
|
||||
DEBUG(misc,1) ("[NET][TCP] closed client connection");
|
||||
DEBUG(net, 1) ("[NET][TCP] closed client connection");
|
||||
|
||||
assert(cs->socket != INVALID_SOCKET);
|
||||
|
||||
|
@ -645,7 +662,7 @@ static bool ReadPackets(ClientState *cs)
|
|||
if ( recv_bytes == (unsigned long)-1) {
|
||||
int err = GET_LAST_ERROR();
|
||||
if (err == EWOULDBLOCK) break;
|
||||
printf("net: recv() failed with error %d\n", err);
|
||||
DEBUG(net, 0) ("[NET] recv() failed with error %d", err);
|
||||
CloseClient(cs);
|
||||
return false;
|
||||
}
|
||||
|
@ -661,7 +678,6 @@ static bool ReadPackets(ClientState *cs)
|
|||
if (size < packet[0]) break;
|
||||
size -= packet[0];
|
||||
pos += packet[0];
|
||||
|
||||
switch(packet[1]) {
|
||||
case 0:
|
||||
HandleCommandPacket(cs, (CommandPacket*)packet);
|
||||
|
@ -678,8 +694,12 @@ static bool ReadPackets(ClientState *cs)
|
|||
case 3:
|
||||
HandleFilePacket((FilePacketHdr*)packet);
|
||||
break;
|
||||
case 5:
|
||||
cs->ready=true;
|
||||
cs->timeout=_network_client_timeout;
|
||||
break;
|
||||
default:
|
||||
error("unknown packet type");
|
||||
DEBUG (net,0) ("net: unknown packet type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -709,7 +729,7 @@ static bool SendPackets(ClientState *cs)
|
|||
if (n == -1) {
|
||||
int err = GET_LAST_ERROR();
|
||||
if (err == EWOULDBLOCK) break;
|
||||
printf("net: send() failed with error %d\n", err);
|
||||
DEBUG(net, 0) ("[NET] send() failed with error %d", err);
|
||||
CloseClient(cs);
|
||||
return false;
|
||||
}
|
||||
|
@ -776,7 +796,7 @@ static void SendXmit(ClientState *cs)
|
|||
|
||||
cs->xmitpos = pos + 1;
|
||||
|
||||
printf("net: client xmit at %d\n", pos + 1);
|
||||
DEBUG(net, 2) ("[NET] client xmit at %d", pos + 1);
|
||||
}
|
||||
|
||||
static ClientState *AllocClient(SOCKET s)
|
||||
|
@ -792,9 +812,22 @@ static ClientState *AllocClient(SOCKET s)
|
|||
memset(cs, 0, sizeof(*cs));
|
||||
cs->last = &cs->head;
|
||||
cs->socket = s;
|
||||
cs->timeout = _network_client_timeout;
|
||||
return cs;
|
||||
}
|
||||
|
||||
void NetworkSendReadyPacket()
|
||||
{
|
||||
if (!_network_ready_sent) {
|
||||
ReadyPacket *rp = malloc(sizeof(rp));
|
||||
ClientState *c = _clients;
|
||||
|
||||
rp->packet_type = 5;
|
||||
rp->packet_length = sizeof(rp);
|
||||
SendBytes(c, rp, sizeof(rp));
|
||||
_network_ready_sent = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void NetworkAcceptClients()
|
||||
{
|
||||
|
@ -817,7 +850,7 @@ static void NetworkAcceptClients()
|
|||
// set nonblocking mode for client socket
|
||||
{ unsigned long blocking = 1; ioctlsocket(s, FIONBIO, &blocking); }
|
||||
|
||||
printf("net: got client from %s\n", inet_ntoa(sin.sin_addr));
|
||||
DEBUG(net, 1) ("[NET] got client from %s", inet_ntoa(sin.sin_addr));
|
||||
|
||||
// set nodelay
|
||||
{int b = 1; setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b));}
|
||||
|
@ -856,7 +889,7 @@ static void SendQueuedCommandsToNewClient(ClientState *cs)
|
|||
SyncPacket sp;
|
||||
int32 frame;
|
||||
|
||||
printf("net: sending queued commands to client\n");
|
||||
DEBUG(net, 2) ("[NET] sending queued commands to client");
|
||||
|
||||
sp.packet_length = sizeof(sp);
|
||||
sp.packet_type = 1;
|
||||
|
@ -866,7 +899,7 @@ static void SendQueuedCommandsToNewClient(ClientState *cs)
|
|||
frame = _frame_counter;
|
||||
|
||||
for(qp=_command_queue.head; qp; qp = qp->next) {
|
||||
printf("net: sending cmd to be executed at %d (old %d)\n", qp->frame, frame);
|
||||
DEBUG(net, 4) ("[NET] sending cmd to be executed at %d (old %d)", qp->frame, frame);
|
||||
if (qp->frame > frame) {
|
||||
assert(qp->frame <= _frame_counter_max);
|
||||
sp.frames = qp->frame - frame;
|
||||
|
@ -877,7 +910,7 @@ static void SendQueuedCommandsToNewClient(ClientState *cs)
|
|||
}
|
||||
|
||||
if (frame < _frame_counter_max) {
|
||||
printf("net: sending queued sync %d (%d)\n", _frame_counter_max, frame);
|
||||
DEBUG(net, 4) ("[NET] sending queued sync %d (%d)", _frame_counter_max, frame);
|
||||
sp.frames = _frame_counter_max - frame;
|
||||
SendBytes(cs, &sp, sizeof(sp));
|
||||
}
|
||||
|
@ -895,10 +928,10 @@ unsigned long NetworkResolveHost(const char *hostname) {
|
|||
// seems to be an hostname [first character is no number]
|
||||
remotehost = gethostbyname(hostname);
|
||||
if (remotehost == NULL) {
|
||||
DEBUG(misc, 2) ("[NET][IP] cannot resolve %s", hostname);
|
||||
DEBUG(net, 1) ("[NET][IP] cannot resolve %s", hostname);
|
||||
return 0;
|
||||
} else {
|
||||
DEBUG(misc,2) ("[NET][IP] resolved %s to %s",hostname, inet_ntoa(*(struct in_addr *) remotehost->h_addr_list[0]));
|
||||
DEBUG(net, 1) ("[NET][IP] resolved %s to %s",hostname, inet_ntoa(*(struct in_addr *) remotehost->h_addr_list[0]));
|
||||
return inet_addr(inet_ntoa(*(struct in_addr *) remotehost->h_addr_list[0]));
|
||||
}
|
||||
} else {
|
||||
|
@ -914,7 +947,7 @@ bool NetworkConnect(const char *hostname, int port)
|
|||
struct sockaddr_in sin;
|
||||
int b;
|
||||
|
||||
DEBUG(misc, 1) ("[NET][TCP] Connecting to %s %d", hostname, port);
|
||||
DEBUG(net, 1) ("[NET][TCP] Connecting to %s %d", hostname, port);
|
||||
|
||||
s = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (s == INVALID_SOCKET) error("socket() failed");
|
||||
|
@ -953,7 +986,7 @@ void NetworkListen()
|
|||
|
||||
port = _network_server_port;
|
||||
|
||||
DEBUG(misc, 1) ("[NET][TCP] listening on port %d", port);
|
||||
DEBUG(net, 1) ("[NET][TCP] listening on port %d", port);
|
||||
|
||||
ls = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (ls == INVALID_SOCKET)
|
||||
|
@ -1007,7 +1040,7 @@ void NetworkReceive()
|
|||
#else
|
||||
n = WaitSelect(FD_SETSIZE, &read_fd, &write_fd, NULL, &tv, NULL);
|
||||
#endif
|
||||
if (n == -1) NetworkHandleConnectionLost();
|
||||
if ((n == -1) && (!_networking_server)) NetworkHandleConnectionLost();
|
||||
|
||||
// accept clients..
|
||||
if (_networking_server && FD_ISSET(_listensocket, &read_fd))
|
||||
|
@ -1052,13 +1085,39 @@ void NetworkSend()
|
|||
{
|
||||
ClientState *cs;
|
||||
void *free_xmit;
|
||||
uint16 count;
|
||||
bool ready_all;
|
||||
|
||||
// send sync packets?
|
||||
if (_networking_server && _networking_sync && !_pause) {
|
||||
|
||||
if (++_not_packet >= _network_sync_freq) {
|
||||
SyncPacket sp;
|
||||
uint new_max;
|
||||
|
||||
|
||||
ready_all=false;
|
||||
|
||||
while (!ready_all) {
|
||||
// check wether all clients are ready
|
||||
ready_all=true;
|
||||
count=0;
|
||||
for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
|
||||
count++;
|
||||
ready_all = ready_all && (cs->ready || cs->inactive || (cs->xmitpos>0));
|
||||
cs->timeout-=5;
|
||||
if (cs->timeout == 0) {
|
||||
SET_DPARAM16(0,count);
|
||||
ShowErrorMessage(-1,STR_NETWORK_ERR_TIMEOUT,0,0);
|
||||
CloseClient(cs);
|
||||
}
|
||||
}
|
||||
if (!ready_all) {
|
||||
NetworkReceive();
|
||||
CSleep(5);
|
||||
}
|
||||
}
|
||||
|
||||
_not_packet = 0;
|
||||
|
||||
new_max = max(_frame_counter + (int)_network_ahead_frames, _frame_counter_max);
|
||||
|
@ -1071,8 +1130,11 @@ void NetworkSend()
|
|||
sp.random_seed_2 = TO_LE32(_sync_seed_2);
|
||||
_frame_counter_max = new_max;
|
||||
|
||||
// send it to all the clients
|
||||
for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) SendBytes(cs, &sp, sizeof(sp));
|
||||
// send it to all the clients and mark them unready
|
||||
for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
|
||||
cs->ready=false;
|
||||
SendBytes(cs, &sp, sizeof(sp));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1124,7 +1186,7 @@ void NetworkClose(bool client) {
|
|||
// if in servermode --> close listener
|
||||
closesocket(_listensocket);
|
||||
_listensocket= INVALID_SOCKET;
|
||||
DEBUG(misc,1) ("[NET][TCP] closed listener on port %i", _network_server_port);
|
||||
DEBUG(net, 1) ("[NET][TCP] closed listener on port %i", _network_server_port);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1141,7 +1203,7 @@ void NetworkShutdown()
|
|||
// switch to synced mode.
|
||||
void NetworkStartSync(bool fcreset)
|
||||
{
|
||||
DEBUG(misc,3) ("[NET][SYNC] switching to synced game mode");
|
||||
DEBUG(net, 3) ("[NET][SYNC] switching to synced game mode");
|
||||
_networking_sync = true;
|
||||
_frame_counter = 0;
|
||||
if (fcreset) {
|
||||
|
@ -1182,7 +1244,7 @@ void NetworkUDPListen(bool client)
|
|||
|
||||
if (client) { port = _network_client_port; } else { port = _network_server_port; };
|
||||
|
||||
DEBUG(misc,1) ("[NET][UDP] listening on port %i", port);
|
||||
DEBUG(net, 1) ("[NET][UDP] listening on port %i", port);
|
||||
|
||||
udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
|
||||
|
@ -1197,7 +1259,7 @@ void NetworkUDPListen(bool client)
|
|||
sin.sin_port = htons(port);
|
||||
|
||||
if (bind(udp, (struct sockaddr*)&sin, sizeof(sin)) != 0)
|
||||
DEBUG(misc,1) ("[NET][UDP] error: bind failed on port %i", port);
|
||||
DEBUG(net, 1) ("[NET][UDP] error: bind failed on port %i", port);
|
||||
|
||||
|
||||
// enable broadcasting
|
||||
|
@ -1211,11 +1273,11 @@ void NetworkUDPListen(bool client)
|
|||
|
||||
void NetworkUDPClose(bool client) {
|
||||
if (client) {
|
||||
DEBUG(misc,1) ("[NET][UDP] closed listener on port %i", _network_client_port);
|
||||
DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port);
|
||||
closesocket(_udp_client_socket);
|
||||
_udp_client_socket = INVALID_SOCKET;
|
||||
} else {
|
||||
DEBUG(misc,1) ("[NET][UDP] closed listener on port %i", _network_server_port);
|
||||
DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_server_port);
|
||||
closesocket(_udp_server_socket);
|
||||
_udp_server_socket = INVALID_SOCKET;
|
||||
};
|
||||
|
@ -1292,7 +1354,7 @@ void NetworkUDPBroadCast(bool client, struct UDPPacket packet) {
|
|||
bcptr[3]=255;
|
||||
out_addr.sin_addr.s_addr = bcaddr;
|
||||
res=sendto(udp,(char *) &packet,sizeof(packet),0,(struct sockaddr *) &out_addr,sizeof(out_addr));
|
||||
if (res==-1) DEBUG(misc,1)("udp: broadcast error: %i",GET_LAST_ERROR());
|
||||
if (res==-1) DEBUG(net, 1)("udp: broadcast error: %i",GET_LAST_ERROR());
|
||||
i++;
|
||||
}
|
||||
|
||||
|
@ -1313,7 +1375,7 @@ bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned sho
|
|||
|
||||
NetworkGameListClear();
|
||||
|
||||
DEBUG(misc,0) ("[NET][UDP] searching server");
|
||||
DEBUG(net, 0) ("[NET][UDP] searching server");
|
||||
*_network_detected_serverip = "255.255.255.255";
|
||||
*_network_detected_serverport = 0;
|
||||
|
||||
|
@ -1331,7 +1393,7 @@ bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned sho
|
|||
*_network_detected_serverip=inet_ntoa(*(struct in_addr *) &item->ip);
|
||||
*_network_detected_serverport=item->port;
|
||||
timeout=-1;
|
||||
DEBUG(misc,0) ("[NET][UDP] server found on %s", *_network_detected_serverip);
|
||||
DEBUG(net, 0) ("[NET][UDP] server found on %s", *_network_detected_serverip);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1352,7 +1414,7 @@ void NetworkIPListInit() {
|
|||
int i=0;
|
||||
|
||||
gethostname(hostname,250);
|
||||
DEBUG(misc,2) ("[NET][IP] init for host %s", hostname);
|
||||
DEBUG(net, 2) ("[NET][IP] init for host %s", hostname);
|
||||
he=gethostbyname((char *) hostname);
|
||||
|
||||
if (he == NULL) {
|
||||
|
@ -1365,12 +1427,12 @@ void NetworkIPListInit() {
|
|||
}
|
||||
|
||||
if (he == NULL) {
|
||||
DEBUG(misc, 2) ("[NET][IP] cannot resolve %s", hostname);
|
||||
DEBUG(net, 2) ("[NET][IP] cannot resolve %s", hostname);
|
||||
} else {
|
||||
while(he->h_addr_list[i]) {
|
||||
bcaddr = inet_addr(inet_ntoa(*(struct in_addr *) he->h_addr_list[i]));
|
||||
_network_ip_list[i]=bcaddr;
|
||||
DEBUG(misc,2) ("[NET][IP] add %s",inet_ntoa(*(struct in_addr *) he->h_addr_list[i]));
|
||||
DEBUG(net, 2) ("[NET][IP] add %s",inet_ntoa(*(struct in_addr *) he->h_addr_list[i]));
|
||||
i++;
|
||||
}
|
||||
|
||||
|
@ -1383,17 +1445,18 @@ void NetworkIPListInit() {
|
|||
|
||||
void NetworkCoreInit() {
|
||||
|
||||
DEBUG(misc,3) ("[NET][Core] init()");
|
||||
DEBUG(net, 3) ("[NET][Core] init()");
|
||||
_network_available=true;
|
||||
_network_client_timeout=3000;
|
||||
|
||||
// [win32] winsock startup
|
||||
|
||||
#if defined(WIN32)
|
||||
{
|
||||
WSADATA wsa;
|
||||
DEBUG(misc,3) ("[NET][Core] using windows socket library");
|
||||
DEBUG(net, 3) ("[NET][Core] using windows socket library");
|
||||
if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) {
|
||||
DEBUG(misc,3) ("[NET][Core] error: WSAStartup failed");
|
||||
DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed");
|
||||
_network_available=false;
|
||||
}
|
||||
}
|
||||
|
@ -1405,7 +1468,7 @@ _network_available=true;
|
|||
{
|
||||
DEBUG(misc,3) ("[NET][Core] using bsd socket library");
|
||||
if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
|
||||
DEBUG(misc,3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
|
||||
DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
|
||||
_network_available=false;
|
||||
}
|
||||
|
||||
|
@ -1416,7 +1479,7 @@ _network_available=true;
|
|||
if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) {
|
||||
if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) {
|
||||
// free ressources...
|
||||
DEBUG(misc,3) ("[NET][Core] Couldn't initialize timer.");
|
||||
DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer.");
|
||||
_network_available=false;
|
||||
}
|
||||
}
|
||||
|
@ -1429,7 +1492,7 @@ _network_available=true;
|
|||
|
||||
// [linux/macos] unix-socket startup
|
||||
|
||||
DEBUG(misc,3) ("[NET][Core] using unix socket library");
|
||||
DEBUG(net, 3) ("[NET][Core] using unix socket library");
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1437,12 +1500,13 @@ _network_available=true;
|
|||
|
||||
|
||||
if (_network_available) {
|
||||
DEBUG(misc,3) ("[NET][Core] OK: multiplayer available");
|
||||
DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
|
||||
// initiate network ip list
|
||||
NetworkIPListInit();
|
||||
IConsoleCmdRegister("connect",NetworkConsoleCmdConnect);
|
||||
IConsoleVarRegister("cfg_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16);
|
||||
} else {
|
||||
DEBUG(misc,3) ("[NET][Core] FAILED: multiplayer not available");
|
||||
DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1450,7 +1514,7 @@ if (_network_available) {
|
|||
|
||||
void NetworkCoreShutdown() {
|
||||
|
||||
DEBUG(misc,3) ("[NET][Core] shutdown()");
|
||||
DEBUG(net, 3) ("[NET][Core] shutdown()");
|
||||
|
||||
#if defined(__MORPHOS__) || defined(__AMIGA__)
|
||||
{
|
||||
|
@ -1564,6 +1628,13 @@ if (incomming) {
|
|||
|
||||
// outgoing
|
||||
|
||||
if ((_networking) && (!_networking_server) && (_frame_counter+1 >= _frame_counter_max)) {
|
||||
// send the "i" am ready message to the server
|
||||
// one frame before "i" reach the frame-limit
|
||||
NetworkSendReadyPacket();
|
||||
}
|
||||
|
||||
|
||||
if (_networking) {
|
||||
NetworkSend();
|
||||
}
|
||||
|
@ -1573,12 +1644,12 @@ if (incomming) {
|
|||
}
|
||||
|
||||
void NetworkLobbyInit() {
|
||||
DEBUG(misc,3) ("[NET][Lobby] init()");
|
||||
DEBUG(net, 3) ("[NET][Lobby] init()");
|
||||
NetworkUDPListen(true);
|
||||
}
|
||||
|
||||
void NetworkLobbyShutdown() {
|
||||
DEBUG(misc,3) ("[NET][Lobby] shutdown()");
|
||||
DEBUG(net, 3) ("[NET][Lobby] shutdown()");
|
||||
NetworkUDPClose(true);
|
||||
}
|
||||
|
||||
|
@ -1591,7 +1662,7 @@ void NetworkGameListClear() {
|
|||
NetworkGameList * item;
|
||||
NetworkGameList * next;
|
||||
|
||||
DEBUG(misc,4) ("[NET][G-List] cleared server list");
|
||||
DEBUG(net, 4) ("[NET][G-List] cleared server list");
|
||||
|
||||
item = _network_game_list;
|
||||
while (item != NULL) {
|
||||
|
@ -1607,7 +1678,7 @@ char * NetworkGameListAdd() {
|
|||
NetworkGameList * item;
|
||||
NetworkGameList * before;
|
||||
|
||||
DEBUG(misc,4) ("[NET][G-List] added server to list");
|
||||
DEBUG(net, 4) ("[NET][G-List] added server to list");
|
||||
|
||||
item = _network_game_list;
|
||||
before = item;
|
||||
|
@ -1628,7 +1699,7 @@ return (char *) item;
|
|||
|
||||
void NetworkGameListFromLAN() {
|
||||
struct UDPPacket packet;
|
||||
DEBUG(misc,2) ("[NET][G-List] searching server over lan");
|
||||
DEBUG(net, 2) ("[NET][G-List] searching server over lan");
|
||||
NetworkGameListClear();
|
||||
packet.command_check=packet.command_code=NET_UDPCMD_SERVERSEARCH;
|
||||
packet.data_len=0;
|
||||
|
@ -1636,7 +1707,7 @@ void NetworkGameListFromLAN() {
|
|||
}
|
||||
|
||||
void NetworkGameListFromInternet() {
|
||||
DEBUG(misc,2) ("[NET][G-List] searching servers over internet");
|
||||
DEBUG(net, 2) ("[NET][G-List] searching servers over internet");
|
||||
NetworkGameListClear();
|
||||
|
||||
// **TODO** masterserver communication [internet protocol list]
|
||||
|
@ -1669,7 +1740,7 @@ void NetworkGameFillDefaults() {
|
|||
extern char _openttd_revision[];
|
||||
#endif
|
||||
|
||||
DEBUG(misc,4) ("[NET][G-Info] setting defaults");
|
||||
DEBUG(net, 4) ("[NET][G-Info] setting defaults");
|
||||
|
||||
ttd_strlcpy(game->server_name,"OpenTTD Game",13);
|
||||
game->game_password[0]='\0';
|
||||
|
|
5
ttd.c
5
ttd.c
|
@ -432,6 +432,7 @@ void SetDebugString(const char *s)
|
|||
_debug_misc_level = v;
|
||||
_debug_grf_level = v;
|
||||
_debug_ai_level = v;
|
||||
_debug_net_level = v;
|
||||
}
|
||||
|
||||
// individual levels
|
||||
|
@ -449,6 +450,7 @@ void SetDebugString(const char *s)
|
|||
else if IS_LVL("spritecache") p = &_debug_spritecache_level;
|
||||
else if IS_LVL("grf") p = &_debug_grf_level;
|
||||
else if IS_LVL("ai") p = &_debug_ai_level;
|
||||
else if IS_LVL("net") p = &_debug_net_level;
|
||||
else {
|
||||
ShowInfoF("Unknown debug level '%.*s'", s-t, t);
|
||||
return;
|
||||
|
@ -881,6 +883,7 @@ void StateGameLoop()
|
|||
// store the random seed to be able to detect out of sync errors
|
||||
_sync_seed_1 = _random_seed_1;
|
||||
_sync_seed_2 = _random_seed_2;
|
||||
if (_networking) disable_computer=true;
|
||||
|
||||
if (_savedump_path[0] && (uint)_frame_counter >= _savedump_first && (uint)(_frame_counter -_savedump_first) % _savedump_freq == 0 ) {
|
||||
char buf[100];
|
||||
|
@ -993,7 +996,7 @@ void GameLoop()
|
|||
if (_frame_counter < _frame_counter_max) {
|
||||
StateGameLoop();
|
||||
NetworkProcessCommands();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!_pause)
|
||||
StateGameLoop();
|
||||
|
|
|
@ -442,6 +442,7 @@ VARDEF int _debug_spritecache_level;
|
|||
VARDEF int _debug_misc_level;
|
||||
VARDEF int _debug_grf_level;
|
||||
VARDEF int _debug_ai_level;
|
||||
VARDEF int _debug_net_level;
|
||||
|
||||
void CDECL debug(const char *s, ...);
|
||||
#ifdef NO_DEBUG_MESSAGES
|
||||
|
|
Loading…
Reference in New Issue