netpanzer-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[netPanzer-CVS] netpanzer ./TODO ./ChangeLog src/Jamfile src/Ne...


From: Matthias Braun
Subject: [netPanzer-CVS] netpanzer ./TODO ./ChangeLog src/Jamfile src/Ne...
Date: Tue, 14 Oct 2003 15:24:24 -0400

CVSROOT:        /cvsroot/netpanzer
Module name:    netpanzer
Branch:         
Changes by:     Matthias Braun <address@hidden> 03/10/14 15:24:24

Modified files:
        .              : TODO ChangeLog 
        src            : Jamfile 
        src/NetPanzer/Classes: PlayerID.hpp PlayerState.hpp 
        src/NetPanzer/Classes/Network: ClientServerNetMessage.hpp 
                                       NetPacket.hpp 
                                       NetworkInterface.cpp 
                                       NetworkInterface.hpp 
        src/UILib/Network: ClientList.cpp ClientList.hpp 
                           ServerSocket.cpp ServerSocket.hpp 
                           SocketClient.cpp SocketClient.hpp 

Log message:
        -fixed crash when client disconnects or connection is lost

Patches:
Index: netpanzer/ChangeLog
diff -u netpanzer/ChangeLog:1.13 netpanzer/ChangeLog:1.14
--- netpanzer/ChangeLog:1.13    Mon Oct 13 10:30:05 2003
+++ netpanzer/ChangeLog Tue Oct 14 15:24:23 2003
@@ -1,3 +1,6 @@
+14-Oct-2003 by Matthias Braun
+-fixed crash when client disconnects or connection is lost
+
 13-Oct-2003 by Matthias Braun
 -fixed wrong const in Surface class
 -don't allow copy constructing of surface class
Index: netpanzer/TODO
diff -u netpanzer/TODO:1.6 netpanzer/TODO:1.7
--- netpanzer/TODO:1.6  Sun Oct 12 18:09:34 2003
+++ netpanzer/TODO      Tue Oct 14 15:24:22 2003
@@ -1,3 +1,10 @@
+*** Improvements
+-Convert the 256 color stuff to truecolor
+-Add timeout/keepalive handling to network layer to correctly detect connection
+ losses and try reconnects
+
+*** Feature Additions
+
 -Improve userinterface:
         * Make usual shortcuts (known from other RTSes) work. Like
           CTRL+number for defining groups, a possibility to set spawnpoint
Index: netpanzer/src/Jamfile
diff -u netpanzer/src/Jamfile:1.4 netpanzer/src/Jamfile:1.5
--- netpanzer/src/Jamfile:1.4   Mon Oct 13 10:30:05 2003
+++ netpanzer/src/Jamfile       Tue Oct 14 15:24:23 2003
@@ -45,5 +45,5 @@
 
 Application netpanzer : $(SOURCES) ;
 CFlags netpanzer : -DDATADIR=\\\"$(datadir)\\\" ;
-ExternalLibs netpanzer : XML SDL SDLNET SDLMIXER SDLIMAGE PHYSFS ;
+ExternalLibs netpanzer : XML SDLNET SDLMIXER SDLIMAGE SDL PHYSFS ;
 Help netpanzer : "Build the main netpanzer executable" ;
Index: netpanzer/src/NetPanzer/Classes/Network/ClientServerNetMessage.hpp
diff -u netpanzer/src/NetPanzer/Classes/Network/ClientServerNetMessage.hpp:1.5 
netpanzer/src/NetPanzer/Classes/Network/ClientServerNetMessage.hpp:1.6
--- netpanzer/src/NetPanzer/Classes/Network/ClientServerNetMessage.hpp:1.5      
Sun Oct  5 09:50:12 2003
+++ netpanzer/src/NetPanzer/Classes/Network/ClientServerNetMessage.hpp  Tue Oct 
14 15:24:23 2003
@@ -67,7 +67,7 @@
 class ClientMesgServerId : public NetMessage
 {
 public:
-    Client::ID server_id;
+    SocketClient::ID server_id;
 
     ClientMesgServerId()
     {
Index: netpanzer/src/NetPanzer/Classes/Network/NetPacket.hpp
diff -u netpanzer/src/NetPanzer/Classes/Network/NetPacket.hpp:1.6 
netpanzer/src/NetPanzer/Classes/Network/NetPacket.hpp:1.7
--- netpanzer/src/NetPanzer/Classes/Network/NetPacket.hpp:1.6   Tue Sep 23 
11:13:04 2003
+++ netpanzer/src/NetPanzer/Classes/Network/NetPacket.hpp       Tue Oct 14 
15:24:23 2003
@@ -29,8 +29,8 @@
 class NetPacket
 {
 public:
-    Client::ID toID;
-    Client::ID fromID;
+    SocketClient::ID toID;
+    SocketClient::ID fromID;
     unsigned short packet_size;
 
     unsigned char data[ _MAX_NET_PACKET_SIZE ];
Index: netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.cpp
diff -u netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.cpp:1.7 
netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.cpp:1.8
--- netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.cpp:1.7    Sun Oct 
 5 09:50:12 2003
+++ netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.cpp        Tue Oct 
14 15:24:23 2003
@@ -23,7 +23,7 @@
 NetPacket TEMP_PACKET;
 
 void EnqueueIncomingPacket(void *message, unsigned long message_size,
-                           Client::ID toID, Client::ID fromID )
+                           SocketClient::ID toID, SocketClient::ID fromID )
 {
     TEMP_PACKET.toID = toID;
     TEMP_PACKET.fromID = fromID;
@@ -41,7 +41,7 @@
 NetPacket TEMP_PACKET2;
 
 void EnqueueUnreliablePacket(void *message, unsigned long message_size,
-                             Client::ID toID, Client::ID fromID )
+                             SocketClient::ID toID, SocketClient::ID fromID )
 {
     TEMP_PACKET2.toID = toID;
     TEMP_PACKET2.fromID = fromID;
Index: netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.hpp
diff -u netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.hpp:1.3 
netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.hpp:1.4
--- netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.hpp:1.3    Tue Sep 
16 16:16:11 2003
+++ netpanzer/src/NetPanzer/Classes/Network/NetworkInterface.hpp        Tue Oct 
14 15:24:23 2003
@@ -21,10 +21,10 @@
 #include "NetPacketQueues.hpp"
 
 void EnqueueIncomingPacket( void *message, unsigned long message_size,
-                            Client::ID toID, Client::ID fromID );
+                            SocketClient::ID toID, SocketClient::ID fromID );
 
 void EnqueueUnreliablePacket( void *message, unsigned long message_size,
-                              Client::ID toID, Client::ID fromID );
+                              SocketClient::ID toID, SocketClient::ID fromID );
 
 class NetworkInterface
 {
Index: netpanzer/src/NetPanzer/Classes/PlayerID.hpp
diff -u netpanzer/src/NetPanzer/Classes/PlayerID.hpp:1.7 
netpanzer/src/NetPanzer/Classes/PlayerID.hpp:1.8
--- netpanzer/src/NetPanzer/Classes/PlayerID.hpp:1.7    Tue Sep 23 11:13:04 2003
+++ netpanzer/src/NetPanzer/Classes/PlayerID.hpp        Tue Oct 14 15:24:23 2003
@@ -25,14 +25,14 @@
 {
 protected:
     uint16_t index_id;
-    Client::ID networkid;
+    SocketClient::ID networkid;
 
 public:
     PlayerID( )
             : index_id(0xFFFF), networkid(0xFFFFFFFF)
     { }
 
-    PlayerID( unsigned short index, Client::ID newid )
+    PlayerID( unsigned short index, SocketClient::ID newid )
             : index_id(index), networkid(newid)
     { }
 
@@ -46,12 +46,12 @@
         return( index_id );
     }
 
-    inline void setNetworkID(Client::ID newid)
+    inline void setNetworkID(SocketClient::ID newid)
     {
         networkid = newid;
     }
 
-    inline Client::ID getNetworkID() const
+    inline SocketClient::ID getNetworkID() const
     {
         return(networkid);
     }
Index: netpanzer/src/NetPanzer/Classes/PlayerState.hpp
diff -u netpanzer/src/NetPanzer/Classes/PlayerState.hpp:1.6 
netpanzer/src/NetPanzer/Classes/PlayerState.hpp:1.7
--- netpanzer/src/NetPanzer/Classes/PlayerState.hpp:1.6 Tue Sep 16 16:16:11 2003
+++ netpanzer/src/NetPanzer/Classes/PlayerState.hpp     Tue Oct 14 15:24:23 2003
@@ -142,7 +142,7 @@
         objectives_held = objectives;
     }
 
-    inline void setID( unsigned short index, Client::ID networkid  )
+    inline void setID( unsigned short index, SocketClient::ID networkid  )
     {
         ID.setIndex(index);
         ID.setNetworkID(networkid);
@@ -153,7 +153,7 @@
         ID.setIndex( index );
     }
 
-    inline void setID( Client::ID networkid )
+    inline void setID( SocketClient::ID networkid )
     {
         ID.setNetworkID(networkid);
     }
Index: netpanzer/src/UILib/Network/ClientList.cpp
diff -u netpanzer/src/UILib/Network/ClientList.cpp:1.3 
netpanzer/src/UILib/Network/ClientList.cpp:1.4
--- netpanzer/src/UILib/Network/ClientList.cpp:1.3      Tue Sep 16 16:16:13 2003
+++ netpanzer/src/UILib/Network/ClientList.cpp  Tue Oct 14 15:24:23 2003
@@ -23,11 +23,18 @@
 {}
 
 ClientList::~ClientList()
-{}
+{
+    for(ClientIterator i = begin(); i != end(); i++) {
+        SocketClient* client = *i;
+        client->wantstodie = true;
+        delete client;
+    }
+    clients.clear();
+}
 
-Client* ClientList::add(ServerSocket* server, TCPsocket socket)
+SocketClient* ClientList::add(ServerSocket* server, TCPsocket socket)
 {
-    Client* client = new Client(server);
+    SocketClient* client = new SocketClient(server);
     client->tcpsocket = socket;
     client->id = nextid++;
     clients.push_back(client);
@@ -35,10 +42,10 @@
     return client;
 }
 
-Client* ClientList::getClientFromID(Client::ID id)
+SocketClient* ClientList::getClientFromID(SocketClient::ID id)
 {
     for(ClientIterator i = begin(); i != end(); i++) {
-        Client* client = *i;
+        SocketClient* client = *i;
         if(client->id == id)
             return client;
     }
@@ -46,18 +53,3 @@
     return 0;
 }
 
-void ClientList::remove(Client* client)
-{
-    for(ClientIterator i = begin(); i != end(); i++) {
-        if(client == *i) {
-            clients.erase(i);
-            break;
-        }
-    }
-    delete client;
-}
-
-void ClientList::removeAll()
-{
-    clients.clear();
-}
Index: netpanzer/src/UILib/Network/ClientList.hpp
diff -u netpanzer/src/UILib/Network/ClientList.hpp:1.3 
netpanzer/src/UILib/Network/ClientList.hpp:1.4
--- netpanzer/src/UILib/Network/ClientList.hpp:1.3      Tue Sep 16 16:16:13 2003
+++ netpanzer/src/UILib/Network/ClientList.hpp  Tue Oct 14 15:24:23 2003
@@ -20,7 +20,7 @@
 
 #include <vector>
 #include <SDL_net.h>
-#include "Client.hpp"
+#include "SocketClient.hpp"
 
 class ServerSocket;
 
@@ -30,11 +30,11 @@
     ClientList();
     ~ClientList();
 
-    Client* add(ServerSocket* server, TCPsocket socket);
+    SocketClient* add(ServerSocket* server, TCPsocket socket);
 
-    Client* getClientFromID(Client::ID id);
+    SocketClient* getClientFromID(SocketClient::ID id);
 
-    typedef std::vector<Client*>::iterator ClientIterator;
+    typedef std::vector<SocketClient*>::iterator ClientIterator;
     ClientIterator begin()
     {
         return clients.begin();
@@ -44,11 +44,12 @@
         return clients.end();
     }
 
-    void remove(Client* client);
-    void removeAll();
+    ClientIterator remove(ClientIterator i)
+    { return clients.erase(i); }
+
 private:
-    std::vector<Client*> clients;
-    Client::ID nextid;
+    std::vector<SocketClient*> clients;
+    SocketClient::ID nextid;
 };
 
 #endif // _WINSOCKCLIENTLIST_H
Index: netpanzer/src/UILib/Network/ServerSocket.cpp
diff -u netpanzer/src/UILib/Network/ServerSocket.cpp:1.7 
netpanzer/src/UILib/Network/ServerSocket.cpp:1.8
--- netpanzer/src/UILib/Network/ServerSocket.cpp:1.7    Fri Sep 19 05:43:52 2003
+++ netpanzer/src/UILib/Network/ServerSocket.cpp        Tue Oct 14 15:24:24 2003
@@ -84,7 +84,7 @@
             LOG ( ("Too many connections to server, dropping client.") );
             return;
         }
-        Client* client = clientlist->add(this, clientsocket);
+        SocketClient* client = clientlist->add(this, clientsocket);
 
         // Put message about connecting client into message queue
         TransportClientAccept clientacceptmessage;
@@ -101,10 +101,18 @@
     // Iterate through client list and check whether data arrived
     ClientList::ClientIterator i;
     for(i = clientlist->begin(); i != clientlist->end(); i++) {
-        Client* client = *i;
+        SocketClient* client = *i;
         if (SDLNet_SocketReady(client->tcpsocket))
             readClientTCP(client);
     }
+
+    // Search for clients that wants to be removed from the list
+    for(i = clientlist->begin(); i != clientlist->end(); i++) {
+        SocketClient* client = *i;
+        if(client->wantstodie) {
+            i = clientlist->remove(i);
+        }
+    }
 }
 
 /** this function recieves data after winsock has sent an
@@ -119,7 +127,7 @@
  * then we have a complete netPanzer message. other cases
  * are handled separately.
  */
-void ServerSocket::readClientTCP(Client* client)
+void ServerSocket::readClientTCP(SocketClient* client)
 {
     static char recvbuffer[10240];
 
@@ -128,8 +136,7 @@
     if(recvsize<=0) {
         printf ("Connection lost for ID %u: %s\n", client->id,
                 SDLNet_GetError());
-        // XXX danger...
-        clientlist->remove(client);
+        client->wantstodie = true;
         return;
     }
 
@@ -152,8 +159,6 @@
                 recvoffset = 0;
                 client->headerincomplete = false;
                 client->tempoffset = 0;
-                clientlist->remove(client);
-                // XXX shouldn't we delete the client here?
                 return;
             }
 
@@ -208,8 +213,6 @@
                     recvoffset = 0;
                     client->messageincomplete = false;
                     client->tempoffset = 0;
-                    clientlist->remove(client);
-                    // XXX shouldn't we delete the client here?
                     return;
                 }
 
@@ -251,8 +254,6 @@
                     LOG( ("OnReadStreamServer : Invalid Packet Size %d", size) 
);
                     recvoffset = 0;
                     client->tempoffset = 0;
-                    // XXX danger
-                    clientlist->remove(client);
                     return;
                 }
 
@@ -305,33 +306,32 @@
  * the game loop needs to be temporarily halted anyway.
  * it handles both TCP and UDP sends--
  */
-void ServerSocket::sendMessage(Client::ID toclient, char* data, size_t 
datasize,
-                               bool reliable)
+void ServerSocket::sendMessage(SocketClient::ID toclient, char* data,
+        size_t datasize, bool reliable)
 {
-    Client* client = clientlist->getClientFromID(toclient);
+    SocketClient* client = clientlist->getClientFromID(toclient);
     if(!client)
         throw Exception("message sent to unknown client.");
 
     // we ignore the reliable flag for now...
     if (SDLNet_TCP_Send(client->tcpsocket, data, (int) datasize)
             < (int) datasize) {
-        clientlist->remove(client);
         throw Exception("Error while sending to client %d: %s", client->id,
                         SDLNet_GetError());
     }
 }
 
-void ServerSocket::closeConnection(Client* client)
+void ServerSocket::closeConnection(SocketClient* client)
 {
     SDLNet_TCP_DelSocket(sockets, client->tcpsocket);
     SDLNet_TCP_Close(client->tcpsocket);
 }
 
-void ServerSocket::removeClient(Client::ID clientid)
+void ServerSocket::removeClient(SocketClient::ID clientid)
 {
     // TODO notify client about disconnect...
-    Client* client = clientlist->getClientFromID(clientid);
+    SocketClient* client = clientlist->getClientFromID(clientid);
     if(client)
-        clientlist->remove(client);
+        client->wantstodie = true;
 }
 
Index: netpanzer/src/UILib/Network/ServerSocket.hpp
diff -u netpanzer/src/UILib/Network/ServerSocket.hpp:1.4 
netpanzer/src/UILib/Network/ServerSocket.hpp:1.5
--- netpanzer/src/UILib/Network/ServerSocket.hpp:1.4    Tue Sep 16 16:16:13 2003
+++ netpanzer/src/UILib/Network/ServerSocket.hpp        Tue Oct 14 15:24:24 2003
@@ -29,18 +29,18 @@
     ~ServerSocket();
 
     void read();
-    void sendMessage(Client::ID toclient, char* data, size_t datasize,
+    void sendMessage(SocketClient::ID toclient, char* data, size_t datasize,
                      bool realiable = true);
-    void removeClient(Client::ID clientid);
+    void removeClient(SocketClient::ID clientid);
 
 protected:
-    friend class Client;
-    void closeConnection(Client* client);
+    friend class SocketClient;
+    void closeConnection(SocketClient* client);
 
 private:
     void acceptNewClients();
     void readTCP();
-    void readClientTCP(Client* client);
+    void readClientTCP(SocketClient* client);
 
     TCPsocket tcpsocket;
     SDLNet_SocketSet sockets;
Index: netpanzer/src/UILib/Network/SocketClient.cpp
diff -u netpanzer/src/UILib/Network/SocketClient.cpp:1.1 
netpanzer/src/UILib/Network/SocketClient.cpp:1.2
--- netpanzer/src/UILib/Network/SocketClient.cpp:1.1    Tue Sep 23 11:13:04 2003
+++ netpanzer/src/UILib/Network/SocketClient.cpp        Tue Oct 14 15:24:24 2003
@@ -1,18 +1,22 @@
 #include <config.h>
 
 #include <string.h>
+#include <assert.h>
 #include "ServerSocket.hpp"
 #include "SocketClient.hpp"
 
-Client::Client(ServerSocket* newserver)
+SocketClient::SocketClient(ServerSocket* newserver)
         : tcpsocket(0), headerincomplete(false),
         messageincomplete(0), udpenabled(false), tempoffset(0),
-        id(0), server(newserver)
+        wantstodie(false), id(0), server(newserver)
 {
     memset(&udpaddress, 0, sizeof(IPaddress));
 }
 
-Client::~Client()
+SocketClient::~SocketClient()
 {
+    assert(wantstodie == true);
+
     server->closeConnection(this);
 }
+
Index: netpanzer/src/UILib/Network/SocketClient.hpp
diff -u netpanzer/src/UILib/Network/SocketClient.hpp:1.1 
netpanzer/src/UILib/Network/SocketClient.hpp:1.2
--- netpanzer/src/UILib/Network/SocketClient.hpp:1.1    Tue Sep 23 11:13:04 2003
+++ netpanzer/src/UILib/Network/SocketClient.hpp        Tue Oct 14 15:24:24 2003
@@ -7,11 +7,11 @@
 
 /** This class keep data from a single client that is connected to the server
  */
-class Client
+class SocketClient
 {
 public:
-    Client(ServerSocket* server);
-    ~Client();
+    SocketClient(ServerSocket* server);
+    ~SocketClient();
 
     TCPsocket tcpsocket;
     IPaddress udpaddress;
@@ -22,6 +22,10 @@
     bool messageincomplete;
     bool udpenabled;
     short tempoffset;
+
+    /// this variable is set to true, when the Client should be removed from
+    /// client list in the next iteratrion
+    bool wantstodie;
 
     typedef Uint32 ID;
     ID id;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]