[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [netPanzer-CVS] netpanzer ./TODO ./ChangeLog src/Jamfile src/Ne...,
Matthias Braun <=