Newsgroup: it.comp.os.linux.development
Titolo: [C+Socket+thread] inviare un messaggio a tutti i client

Ho un client e un server che comunicano tramite socket TCP. Ogni volta
che il programma client tenta di connettersi al server, il server crea
un nuovo thread detached. In questo modo ci sarà un solo server e più
client connessi al server.
Ora se uno dei client invia un particolare input al server,
quest'ultimo deve mandare un messaggio a tutti i client.
Come fare?

 wrote:

un flag condiviso che tutti i thread controllano, e se e' settato, mandano
il messaggio IMHO. 
ilSimo
-- 
now playing: 
So there He stands, Mightiest among the Mighty 
Guarding a Holy Place where evil's never to rise 
Archangel of Salvation, Vision of Majesty
Fly higher, bring the Fire, The Flame of God
                                Domine - Uriel, The Flame Of God


Che intendi per flag condiviso? Una variabile sul server che tutti i
client possono controllare??? E poi? Come la uso? Ogni tot tempo
controllo il valore di questa variabile???

 controllo il valore di questa variabile???
e' il server che deve mandare il messaggio a tutti, no?
allora basta una variabile globale nel server che sia visibile a tutti i
thread, in modo che possano controllarla. 
occhio all'accesso alla variabile condivisa.
ilSimo
-- 
now playing: 
Goodbye my friends, I'm leavin' you today
My quest is hard, but I must be on my way
Now, don't ask why
Goodbye, dear Friends
                                Gammaray - Farewell


La soluzione della variabile condivisa l'ho già pensata ma, il mio
caso è:
sul server parte un campo di gioco, più client giocano
contemporaneamente sfruttando quel campo di gioco (partecipano alla
stessa partita).
Il client che fa la mossa vincente riceve il messaggio del server che
gli comunica che ha fatto la mossa vincente e la partita è vinta.
Ora tutti gli altri client aspettano che il giocatore faccia la
prossima mossa, anche se la partita è già stata vinta da un altro
utente. Appena uno di questi client conferma la mossa riceve il
messaggio che la partita è stata già completata.
Questa situazione è già soddisfacente, la "perfezione" sarebbe che,
appena un client vince, tutti gli altri client possono sapere
IMMEDIATAMENTE che la partita è stata vinta da un altro utente (senza
quindi fare una mossa "inutile" prima di averne notizia.).

 stessa partita).
IMHO il problema e` la soluzione di base, se piu` client partecipano a 
una stessa partita il thread del server dovresti staccarlo solo per la 
partita, all'interno della partita potresti avere una select() che 
aspetta i descriptor di tutti i client partecipanti, se un client vince, 
scorri la lista dei descriptor partecipanti alla partita e mandi il 
messaggio a tutti i client.
Utilizzare un thread per ogni client significa implicitamente crearsi 
dei punti di "sync", potresti comunque avere la lista dei client 
protetta da un mutex, lockare il mutex, scorrere la lista e inviare il 
messaggio a tutti i client partecipanti alla partita.
Ovviamente il mutex andrebbe lockato ad ogni accesso alla lista, in 
lettura o in scrittura che sia (anche x gestire in modo pulito le 
disconnessioni).
Questo e` l'esempio di un serverino semplice semplice che scrissi tempo 
fa che gestisce le connessioni tramite select usando un solo thread:
http://ggmud.svn.sourceforge.net/viewvc/ggmud/trunk/ggmud/chatserver.c?revision=225&view=markup
--
Ciao,
  Gabry