Ciao a tutti, ho un problema con il mio sistema di client-server. Le comunicazioni avvengono sempre correttamente quando i server vengono avviati prima dei client, ma ho un grosso problema quando cerco di eseguire la seguente sequenza di operazioni (raccolte in uno script per il testing dell'applicazione):
codice:
#avvio tutti i client:
./cliente --param --param &
./cliente --param1 --param1 &
./cliente --param2 &
#avvio i server
./server -par1
./server -par2
./server -par3
#attendo terminazione client
sleep 5
#killo tutti i server
killall -w server
In questo caso le connessioni dei vari clienti ai server avvengono in modo del tutto casuale: alle volta comunicano perfettamente, alle volte ci sono scambi di messaggi multipli con alcuni server, altre comunicano con un server solo e così via..
Il codice del cliente è abbastanza semplice: ho allocato un array di tipo char**, dove ogni puntatore altri non è che il path della socket sulla quale comunicare. Dopo di che, in maniera ciclica, faccio una chiamata alla connect su ogni path, ripetendo la chiamata un numero definito di volte (3), tentativi ripetuti ogni k secondi (1). Tuttavia quando i server sono avviati dopo i client, non riesco proprio a connetterli! Sembra che "non si aspettino", alcune connessioni falliscono e i client non riescono a ripetere il tentativo prima della chiamata a killall che termina i server. Premetto che non posso modificare il tempo di attesa nello script, quindi vi chiedo qualche suggerimento su come cercare di sincronizzare le comunicazioni. Ecco un po di codice del client:
codice:
.....
char **sockpath; //contiene i path delle socket, copiati da un file tramite getline. La copia è ok.
int *connect; //array di socket descriptor restituiti dalla chiamata connect;
//npath è conteggiato qui, dove ometto tutti i controlli superflui alla soluzione del problema.
for(i=0; i<npath;i++){
connect[i] = openConnection(sockpath[i], NTENTATIVI, NSECONDI); //analoga alla connect. FUNZIONA.
if(connect[i] == -1) continue; //passo al sock successivo.
}
//altro ciclo per inviare messaggi a tutte le socket di cui sopra.
for(i=0;i<npath;i++){
sendMessage(connect[i], messaggio); //funzione da me realizzata, analoga alla send. FUNZIONA.
//sveglio il ricevente
signal(wait_msg);
//attendo una risposta
wait(wait_answ);
receiveMessage(connect[i], risposta); //analoga alla receive. FUNZIONA.
}
//fine
return 0;
So che avrei potuto fare tutto in un ciclo, ma le sto provando davvero tutte per cercare di risolvere questi problemi di sincronizzazione, ma anche così facendo, ottengo tutti i socket descriptor, ma i messaggi vengono inviati in maniera casuale. Qualcuno ha qualche suggerimento in merito?