View Full Version : Chat multi-utente
Gino+89+
09-11-2006, 19:14
Devo creare una chat multi-utente, nel momento in cui un utente accede al file di aggiornamento (in rete) non accade nulla, nel momento in cui vi entrano (mod. r+) più utenti contemporaneamente c'è il pericolo che scrivendo nello stesso istante sul file si *inchiodi l'applicazione*?...
Grazie mille
Dr.Speed
09-11-2006, 19:24
Devo creare una chat multi-utente, nel momento in cui un utente accede al file di aggiornamento (in rete) non accade nulla, nel momento in cui vi entrano (mod. r+) più utenti contemporaneamente c'è il pericolo che scrivendo nello stesso istante sul file si *inchiodi*?...
Grazie mille
mi inscrivo perche sono interessato anchio :)
Gino+89+
09-11-2006, 19:27
mi inscrivo perche sono interessato anchio :)
No perchè se scrivo 8000 linee di codice e poi non funziona cambio mestiere (scuola :D )...
Dr.Speed
09-11-2006, 19:34
No perchè se scrivo 8000 linee di codice e poi non funziona cambio mestiere (scuola :D )...
:D
forse non s'inchioda ma il funzionamento sarà ambiguo...dovresti gestire un lock del file.
Gino+89+
09-11-2006, 19:38
forse non s'inchioda ma il funzionamento sarà ambiguo...dovresti gestire un lock del file.
Mhm...Mi potresti fare un esempio sempre a livello teorico?...Tnx
Edit: non ho ben capito quel *lock* del file
Mhm...Mi potresti fare un esempio sempre a livello teorico?...Tnx
Edit: non ho ben capito quel *lock* del file
ad esempio un client aprendo il file crea un file vuoto file.lock gli altri client se lo trovano evitano di aprire il file...così almeno eviti errori da scritture contemporanee.
ovviamente chiudendo il file cancelli il lock
Gino+89+
10-11-2006, 14:11
ad esempio un client aprendo il file crea un file vuoto file.lock gli altri client se lo trovano evitano di aprire il file...così almeno eviti errori da scritture contemporanee.
ovviamente chiudendo il file cancelli il lock
Mhm...facciamo l'esempio di tre utenze.
Il primo si collega e quindi crea il file.lock...gli altri 2 utenti che si collegano successivamente al primo vanno a scrivere in quel file.lock?...ma in questo modo non c'è comunque il pericolo che si scriva contemporaneamente sul nuovo file.lock?
Oppure intendevi:
Ogni client ha un suo file.lock e ci scrive dentro, il file principale viene aggiornato (dal primo utente) attraverso questi file.lock (tanti quanti gli utenti-1) ogni tot tipo 1 o 2 sec...
Oppure Non ci ho capito un tubo del tutto? ;)
Gino+89+
10-11-2006, 14:23
ad esempio un client aprendo il file crea un file vuoto file.lock gli altri client se lo trovano evitano di aprire il file...così almeno eviti errori da scritture contemporanee.
ovviamente chiudendo il file cancelli il lock
Ah capito...ottima idea ma se due utenti inviano l'ordine di scrittura nello stesso precisissimo memento in cui il file .lock non è presente? :D
Ma io non ho capito il discorso del file, a che ti serve scrivere su un file per fare una semplicissima chat?
Gino+89+
10-11-2006, 14:50
Ma io non ho capito il discorso del file, a che ti serve scrivere su un file per fare una semplicissima chat?
E come la fai altrimenti?
Server e tanti client, il client manda il mex al server che lo smista a tutti gli altri client, più semplice di così...
Spe il tuo problema per caso è quando un utente si collega alla chat, non quando bisogna inviare i messaggi?
Gino+89+
10-11-2006, 15:06
Server e tanti client, il client manda il mex al server che lo smista a tutti gli altri client, più semplice di così...
Si teoricamente ho capito...Ma in pratica non sarei (sinceramente) in grado di farlo...quindi vada per l'algoritmo più legnoso dei file ma perlomeno per me fattibile :D
Gino+89+
10-11-2006, 15:08
Spe il tuo problema per caso è quando un utente si collega alla chat, non quando bisogna inviare i messaggi?
Bè quando si collega deve ovviamente vedere tutti i post precedenti e poter partecipare...
In ogni modo il mio problema era dello scrivere contemporaneamente un post che effetti poteva produrre...
Ma è una chat strana, cioè se uno si collega dopo 4 ore di conversazione non credo debba poter vedere tutto ciò che è stato scritto, comunque anche se la vuoi fare così non sarebbe poi un gran porblema.
Per far modificare un file da + utenti dovresti comuqnue creare una specie di coda, esempio:
utente A e utente B
A fa richiesta di poter scrivere sul file, la coda è libera quindi la richiesta viene accordata e A scrive sul file, mentre sta scrivendo B fa la stessa richiesta, ma viene messo in coda perchè un altro utente sta scrivendo...un ipotetico utente C se anche volesse scrivere sul file viene messo in coda dopo B e così via...
Se "evento molto raro" A e B fanno richiesta insieme, viene deciso chi mettere in coda e a chio invece far eseguire subito la scrittura.
Gino+89+
10-11-2006, 15:28
Ma è una chat strana, cioè se uno si collega dopo 4 ore di conversazione non credo debba poter vedere tutto ciò che è stato scritto, comunque anche se la vuoi fare così non sarebbe poi un gran porblema.
Per far modificare un file da + utenti dovresti comuqnue creare una specie di coda, esempio:
utente A e utente B
A fa richiesta di poter scrivere sul file, la coda è libera quindi la richiesta viene accordata e A scrive sul file, mentre sta scrivendo B fa la stessa richiesta, ma viene messo in coda perchè un altro utente sta scrivendo...un ipotetico utente C se anche volesse scrivere sul file viene messo in coda dopo B e così via...
Se "evento molto raro" A e B fanno richiesta insieme, viene deciso chi mettere in coda e a chio invece far eseguire subito la scrittura.
Mamma mia...allora...come faccio a mettere in coda un utente??..ci vuole un file aggiuntivo?
Ma con quale linguaggio le devi scrivere ? Molti linguaggi hanno già la possibilità di aprire i file in modalità esclusiva, basterebbe questo se non hai bisogno di centinaia di utenti contemporaneamente.
Secondo me fai prima ad impararti il protocollo TCP e fare una cosa server-client, ti viene un lavoro molto più bello e facilmente personalizzabile.
Te ne butto li un'altra(mi piace fantasticare :D).
Hai un file chat.dat il quale viene mostrato a tutti i clien collegati(la chat per intenderci ma viene scritta solo da un processo, non so magari da chi ha aperto la chat...).
Quando un utente deve scrivere qualcosa, CREA un file dove scrive la data ed il messaggio.
Così per ogni utente...
Il processo che va a scrivere sul file chat.dat non fa altro che controllare ogni TOT tempo(non so ogni 500 ms, oppure ongi secondo) quanti file_utente ci sono, aprirli tutti e scrivere sul file chat.dat i messaggi prendendoli in ordine di chi ha la data + vecchia. E poi cancella i file_utente.
Gino+89+
10-11-2006, 18:16
Ma con quale linguaggio le devi scrivere ? Molti linguaggi hanno già la possibilità di aprire i file in modalità esclusiva, basterebbe questo se non hai bisogno di centinaia di utenti contemporaneamente.
Programmo in C...
Te ne butto li un'altra(mi piace fantasticare ).
Hai un file chat.dat il quale viene mostrato a tutti i clien collegati(la chat per intenderci ma viene scritta solo da un processo, non so magari da chi ha aperto la chat...).
Quando un utente deve scrivere qualcosa, CREA un file dove scrive la data ed il messaggio.
Così per ogni utente...
Il processo che va a scrivere sul file chat.dat non fa altro che controllare ogni TOT tempo(non so ogni 500 ms, oppure ongi secondo) quanti file_utente ci sono, aprirli tutti e scrivere sul file chat.dat i messaggi prendendoli in ordine di chi ha la data + vecchia. E poi cancella i file_utente.
Ah ok ci avevo pensato pure io ad una cosa del genere poi però molto lavoro va a carico del primo uetente collegatosi (ogni volta il lavoro di aggiornamento)...
Penso che farò un file di lock (semaforo) come proposto da vizzz, visto che molte volte la soluzione più semplice è la più efficace...per quanto riguarda la coda, la cosa risulta alquanto complessa, visto che avendo anche solo un file coda ci potrebbe IMHO essere il caso in cui due utenti scrivino in coda contemporaneamente...il problema potrebbe essere risolto con più file diversi di tipo coda (n file coda)...visto che non ho voglia di stare dietro ad una roba del genere non ne tengo conto della coda :Prrr: ...poi tanto al max ci saranno 20/30 utenti collegati (ma prorpio al massimo) e buonanotte...
Programmo in C...
Puoi usare solo C standard ?
Gino+89+
10-11-2006, 18:33
Puoi usare solo C standard ?
Preferibilmente sì..perchè?
Perchè nel C standard non ci sono semafori, mutue esclusioni e apertura di un file in modalità esclusiva...
L'unica soluzione è il file di lock...
PS: file di lock e semafori sono due cose diverse...
Gino+89+
10-11-2006, 18:41
Perchè nel C standard non ci sono semafori, mutue esclusioni e apertura di un file in modalità esclusiva...
L'unica soluzione è il file di lock...
PS: file di lock e semafori sono due cose diverse...
Si vede che farò un file di questo tipo ogni volta che leggo, quando finisco lo cancello e così via per ogni utente. Per quanto riguarda l'applicazione in sè, si deve automaticamente aggiornare da sola dal file principale ogni TOT che decido io?
Atra domanda: posso solo leggere un file mentre un'altro scrive giusto?
Atra domanda: posso solo leggere un file mentre un'altro scrive giusto?
Io eviterei...non vorrei che tu arrivassi a leggere a metà scrittura (improbabile, ma chi lo sa)...
Gino+89+
10-11-2006, 18:53
Io eviterei...non vorrei che tu arrivassi a leggere a metà scrittura (improbabile, ma chi lo sa)...
Bene...anzi male...meglio se aggiorno automaticamente tutti ad ogni fine scrittura?...creando un file tipo il precedente ma con l'effetto contrario?
La chat funziona in rete nel senso che usi i socket ?
Gino+89+
10-11-2006, 18:58
La chat funziona in rete nel senso che usi i socket ?
No le cose sono MOOLTO più semplici...in rete LAN nella cartella di lavoro condivisa installo il programma :D
(diciamo che è il primo programma decente (GUI) che mi sono posto di fare)
Quindi i file ti servono per scambiare i dati da una postazione all'altra... Diciamo che è il tuo "mezzo" di comunicazione...
Ogni volta che un client invia un messaggio scrivi il messaggio nel file relativo al client di destinazione, senza passare dal file comune che avevi pensato prima...quando il client (periodicamente) controlla se ci sono messaggi per lui, leggi il file ed eliminalo...
Tutte queste operazioni devono essere protette dal file di lock (anche la lettura fino dopo l'eliminazione).
Hai bisogno anche di un altro file: quello relativo alla lista di nickname presenti...lo puoi fare statico o dinamico:
- statico: ci metti la lista di nickname abilitati e non lo tocchi più
- dinamico: la lista dei nickname può variare quando un client decide di creare un nuovo account
Nel secondo caso sia la lettura che l'aggiornamento devono essere protetti da file di lock, nel primo caso tutti leggono, quindi non hai bisogno del file di lock.
Dr.Speed
10-11-2006, 19:33
Quindi i file ti servono per scambiare i dati da una postazione all'altra... Diciamo che è il tuo "mezzo" di comunicazione...
Ogni volta che un client invia un messaggio scrivi il messaggio nel file relativo al client di destinazione, senza passare dal file comune che avevi pensato prima...quando il client (periodicamente) controlla se ci sono messaggi per lui, leggi il file ed eliminalo...
Tutte queste operazioni devono essere protette dal file di lock (anche la lettura fino dopo l'eliminazione).
Hai bisogno anche di un altro file: quello relativo alla lista di nickname presenti...lo puoi fare statico o dinamico:
- statico: ci metti la lista di nickname abilitati e non lo tocchi più
- dinamico: la lista dei nickname può variare quando un client decide di creare un nuovo account
Nel secondo caso sia la lettura che l'aggiornamento devono essere protetti da file di lock, nel primo caso tutti leggono, quindi non hai bisogno del file di lock.
pero' pensavo fosse piu semplice realizzarla :sofico:
Gino+89+
10-11-2006, 19:38
Quindi i file ti servono per scambiare i dati da una postazione all'altra... Diciamo che è il tuo "mezzo" di comunicazione...
Ogni volta che un client invia un messaggio scrivi il messaggio nel file relativo al client di destinazione, senza passare dal file comune che avevi pensato prima...quando il client (periodicamente) controlla se ci sono messaggi per lui, leggi il file ed eliminalo...
Tutte queste operazioni devono essere protette dal file di lock (anche la lettura fino dopo l'eliminazione).
Hai bisogno anche di un altro file: quello relativo alla lista di nickname presenti...lo puoi fare statico o dinamico:
- statico: ci metti la lista di nickname abilitati e non lo tocchi più
- dinamico: la lista dei nickname può variare quando un client decide di creare un nuovo account
Nel secondo caso sia la lettura che l'aggiornamento devono essere protetti da file di lock, nel primo caso tutti leggono, quindi non hai bisogno del file di lock.
Ok....
Per quanto riguarda il processo di aggiornamento lo inserisco nel ciclo dei messaggi dell'applicazione winApi giusto??
ma di che linguaggio stiamo parlando??? :confused:
Gino+89+
10-11-2006, 19:43
ma di che linguaggio stiamo parlando??? :confused:
Sempre del linguaggio C...ma l'algoritmo dovrebbe funzionare ovunque
per non comprare il my_sql nel mio forum in php che ora è a circa 1000 utenti iscritti ogni profilo utente è un file a parte, così nn c'è rischio di perdere dati :D
cmq parlando di c il modo migliore è sicuramente un applicazione tipo server-client
Anche se usi un file di lock il problema sussiste ugualmente, tanto vale che non lo usi e te ne freghi allora.
Programmo in C...
Ah ok ci avevo pensato pure io ad una cosa del genere poi però molto lavoro va a carico del primo uetente collegatosi (ogni volta il lavoro di aggiornamento)...
Penso che farò un file di lock (semaforo) come proposto da vizzz, visto che molte volte la soluzione più semplice è la più efficace...per quanto riguarda la coda, la cosa risulta alquanto complessa, visto che avendo anche solo un file coda ci potrebbe IMHO essere il caso in cui due utenti scrivino in coda contemporaneamente...il problema potrebbe essere risolto con più file diversi di tipo coda (n file coda)...visto che non ho voglia di stare dietro ad una roba del genere non ne tengo conto della coda :Prrr: ...poi tanto al max ci saranno 20/30 utenti collegati (ma prorpio al massimo) e buonanotte...
Ma che carico vuoi che sia??? su che computer devi fare girare sta cosa, sui dei 486? :confused:
Per quanto riguarda il processo di aggiornamento lo inserisco nel ciclo dei messaggi dell'applicazione winApi giusto??
Ma non dovevi usare il C standard ? :what:
Gino+89+
11-11-2006, 14:52
Ma non dovevi usare il C standard ? :what:
Ops scusa uso la stdio.h e la windows.h più altre librerie come string.h etc...
Ma che carico vuoi che sia??? su che computer devi fare girare sta cosa, sui dei 486?
Bhe in effetti :D
Bhe in effetti :Dcomputer aziendali rulez :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.