Je suis un peu novice en programmation C++ et je suis en train de coder un gestionnaire d'objets pour un jeu multijoueur mais j'ai des doutes sur la façon de gérer les objets client. L'objet client est composé de paramètres client connectés (comme IP, temps connecté, données reçues, etc.). Pour éviter la fragmentation de la mémoire, je prévois d'allouer un pool d'objets avec le nombre maximum de clients autorisés. Pour cela, je suis un gestionnaire de codage objet client comme ceci:Meilleures pratiques avec le gestionnaire d'objets
ClientManager.h
#include "Client.h"
class ClientManager {
public:
static void init(int max); //initialize pool (allocate memory)
static void dispose(); //dispose pool (deallocate memory)
static bool add(int socketFd); //add connected client by its socket file descriptor
static bool remove(int socketFd); //remove connected client by its socket fd
static Client& get(int socketFd); //get the client object by its socket fd
private:
Client* clientList; //array of allocated clients objects
int maxClient; //max number of connected clients allowed
Notez que cette classe sera appelée que la façon statique donc il n'y a pas de constructeurs/destructeurs. Cette classe doit être statique car il est impératif que les données client puissent être lues/modifiées entre différents types d'objets.
La mise en œuvre sera quelque chose comme:
ClientManager.cpp
void ClientManager::init(int max) {
maxClient = max;
clientList = new Client[maxClient];
}
void ClientManager::dispose() {
maxClient = 0;
delete [] clientList;
clientList = NULL;
}
bool ClientManager::add(int socketFd) {
//search pool for non-initialized object
//if(there is a non-initializes object) { initialize it with socketFd and return true}
//else return false;
}
bool ClientManager::remove(int socketFd) {
//search pool for socketFd
//if(socketFd found) { clear object (make it non-initialized) and return true}
//else return false
}
Client& ClientManager::get(int socketFd) {
//search for object position
if(pos) return clientList[pos];
else ???????
}
Maintenant, comment puis-je gérer le retour de l'objet dans la fonction get? Est-ce par référence la meilleure option? Je ne veux pas retourner un pointeur mais si c'est ma dernière option, je peux vivre avec. Je suppose que je peux m'assurer que je n'ai que l'objet enregistré (initialisé) dans le pool, si c'est le cas dans la fonction get? Je ne veux pas d'affirmation parce que je veux que le code soit robuste et ne s'arrête pas pendant l'exécution (je suis nouveau en C++ donc si je dis quelque chose de mal, corrigez-moi).
dans le programme principal, je pense à quelque chose comme:
Daemon.cpp
#include "ClientManager.h"
int main(...) {
ClientManager::init(100);
while(1) {
//do server stuff
//get onConnect event (new client is connecting)
//get onDisconnect event (connected client has gone offline)
//get onDataReceived event (connected client has sent data)
}
}
void onConnect(int socketFd) {
ClientManager::add(socketFd);
}
void onDisconnect(int socketFd) {
ClientManager::remove(socketFd);
}
void onDataReceived(int socketFd) {
do_something(ClientManager::get(socketFd).data);
}
Suis-je faire droit? Merci
Notes:
1) Ce code est dans mon esprit et je l'ai tapé ici, donc j'ai peut-être oublié quelque chose.
2) Le programme se terminera uniquement en étant tué (j'utilise linux), donc la méthode disposer de ClientManager ne sera pas explicitement appelée dans le programme principal (puisqu'il s'agit d'une classe statique). Encore une fois, si je dis quelque chose de mal s'il vous plaît dites-moi!
3) Désolé mon mauvais anglais :)
Pourquoi vous souciez-vous de la fragmentation de la mémoire? Si vous avez seulement 100 clients, cela ne devrait pas être un gros problème. – thebretness
Dupliquer? Même affiche: http://stackoverflow.com/questions/2320106/help-with-memory-allocation-for-multiplayer-game-server –
Oui, cette question était aussi la mienne mais celle-ci concerne un pool de gestion de clients – Akira