X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fnetwork.c;h=2bbdf6b18b1277c576258cee3982775f379e858b;hb=2fab4d4c183c2ac47cef52a09b45ed6a83ad31cb;hp=2bc8f5c4d477984d761f3094b9fe820e93d3a24d;hpb=534881ab3184952023d05c6aa739bc7fcf8da82a;p=rocksndiamonds.git diff --git a/src/network.c b/src/network.c index 2bc8f5c4..2bbdf6b1 100644 --- a/src/network.c +++ b/src/network.c @@ -541,7 +541,8 @@ static void Handle_OP_STOP_PLAYING() { int client_nr = buffer[0]; int index_nr = client_nr - 1; - boolean stopped_by_remote_player = (index_nr != local_player->index_nr); + struct PlayerInfo *client_player = &stored_player[index_nr]; + boolean stopped_by_remote_player = (!client_player->connected_locally); char *message = (buffer[2] == NETWORK_STOP_BY_PLAYER ? "Network game stopped by player!" : buffer[2] == NETWORK_STOP_BY_ERROR ? @@ -664,31 +665,71 @@ static void HandleNetworkingMessages() SendToServer_StopPlaying(NETWORK_STOP_BY_ERROR); } -/* TODO */ +static char *HandleNetworkingPackets() +{ + while (1) + { + /* ---------- check network server for activity ---------- */ + + int num_active_sockets = SDLNet_CheckSockets(rfds, 1); + + if (num_active_sockets < 0) + return "Error checking network sockets!"; + + if (num_active_sockets == 0) + break; // no active sockets, stop here + + /* ---------- read packets from network server ---------- */ + + int num_bytes = SDLNet_TCP_Recv(sfd, readbuffer + nread, 1); + + if (num_bytes < 0) + return "Error reading from network server!"; + + if (num_bytes == 0) + return "Connection to network server lost!"; + + nread += num_bytes; + + HandleNetworkingMessages(); + } + + return NULL; +} + +static void HandleNetworkingDisconnect() +{ + int i; + + SDLNet_TCP_DelSocket(rfds, sfd); + SDLNet_TCP_Close(sfd); + + network.enabled = FALSE; + network_playing = FALSE; + + for (i = 0; i < MAX_PLAYERS; i++) + stored_player[i].connected_network = FALSE; +} void HandleNetworking() { - int r = 0; + char *error_message = HandleNetworkingPackets(); - do + if (error_message != NULL) { - if ((r = SDLNet_CheckSockets(rfds, 1)) < 0) - Error(ERR_EXIT, "HandleNetworking(): SDLNet_CheckSockets() failed"); + HandleNetworkingDisconnect(); - if (r > 0) + if (game_status == GAME_MODE_PLAYING) { - r = SDLNet_TCP_Recv(sfd, readbuffer + nread, 1); - - if (r < 0) - Error(ERR_EXIT, "error reading from network server"); - - if (r == 0) - Error(ERR_EXIT, "connection to network server lost"); + Request(error_message, REQ_CONFIRM | REQ_STAY_CLOSED); - nread += r; + SetGameStatus(GAME_MODE_MAIN); - HandleNetworkingMessages(); + DrawMainMenu(); + } + else + { + Request(error_message, REQ_CONFIRM); } } - while (r > 0); }