|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 6
|
[C++] Creare chat con più persone
salve,
avrei in mente di creare una chat in c++ per più persone utilizzando un server. ma il mio problema è che non so da dove cominciare con il codice. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2001
Messaggi: 290
|
Ciao,
Io ho creato la chat tra più persone, con un server, utilizzando VB6 (che ti consiglio vivamente se non sei vincolato al C++), posso darti qualche dritta se vuoi. Io ho creato la comunicazione con la seguente logica: User1 (Invia messaggio a User 2) ->(IP)Server ->(IP)User2 (riceve messaggio) User2 (risponde al messaggio di User1) ->(IP)Server ->(IP)User1 (riceve risposta) Per fare questo mi sono servito della comunicazione tramite Socket (ti consigliavo VB6, per la semplicità di gestione dei socket) Inoltre visto che la comunicazione avviene esclusivamente come stringa inviata al IP, ho creato una sintassi delle Stringhe per la "gestione del sistema" ( es: #!&%|RichiestaConnessione|%&!# - 192.168.0.xxx - USERxxx - PWxxx indicava al server che l'utente con IP 192.168.0.xxx richiede di connettersi con il profilo USERxxx e Password PWxxx). Questo dovrebbe darti un indicazione di massima. Se serve qualche altra info, fammi sapere. Ciao.
__________________
S.M. Asus P5KC - Q6600 - 2 Gb Ram - Geforce 8800GT. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Beh, potresti partire da qui:
http://beej.us/guide/bgnet/output/print/bgnet_A4_2.pdf Se sei proprio a digiuno di reti ti consiglio di comprarti il libro di Andrew Tanenbaum "Reti di Calcolatori" o almeno leggerti delle dispense. Affrontare la programmazione di rete senza conoscere bene le reti puo' essere a dir poco traumatico...
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12966
|
Fare codice nuovo in VB6 nel 2012 mi sembra una follia... semmai usa .NET.
Comunque potresti usare le librerie Qt per C++, che ti mettono a disposizione oltre alla parte grafica anche una libreria enorme di classi, tra cui quelle per la gestione di rete. Detto ciò, bisogna vedere che tipo di chat vuoi realizzare... a stanze oppure per lista di contatti (come MSN ad esempio)... |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 6
|
il mio problema è quello di fare in modo che più client potesssero accedere a un unico server.
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Quote:
Prima di tutto devi capire quali funzionalità la chat ed il server devono avere Devi definire un tuo protocollo, un framing...oppure vedere se qualcuno di già preesistente può fare al caso tuo (IRC, XMPP (mha...)) Attento se scegli la strada del definire un tuo protocollo nel valutare se avrai bisogno di inviare dati in formato binario oltre che a quello "testo" (file tra utenti, avatar e così via) - potresti ritrovarti nella situazione di XMPP dove file/avatar e così via devono essere scambiati in base64 Ti ricordo che in informatica non esiste alcun "plain text" quindi dovrai scegliere anche una tua codifica del testo (utf8?) Inoltre sarebbe il caso prevedere l'uso di TLS ad esempio per la criptazione della comunicazione client/server Devi assolutamente avere buone conoscenze di C++ Un server che fa memory leak per poi essere killato dall'OS oppure che va in crash renderà il tutto inutilizzabile Poi devi sapere le basi del networking, tcp/ip e capire BENE come funzionano i socket Per C++ c'è l'ottima libreria Boost Asio: http://www.boost.org/doc/libs/1_49_0...oost_asio.html che ti aiuterà molto sotto questo aspetto Devi capire se prendere la strada del multi threading tramite i threads e comunicazione tramite shared memory oppure scegliere la strada dell'event based con operazioni asincrone basate sulle "promesse" (per esempio Javascript, Python con Twisted e così via) Nel caso scegliessi la seconda strada - dimenticati la possibilità di sfruttare al pieno le cpu/core del tuo server a meno che di non avere più processi che comunicano tra di loro Se scegli la prima strada fai molta attenzione di aver capito prima: il memory model di C++ (da C++11 ne ha uno), come una cpu x64 riordina le istruzioni, la cache coherence tra i vari core, le varie tipologie di lock e sopratutto perchè e dove devi usare i lock, i problemi dei lock (deadlock, livelock, priority inversion...) Attenzione se scegli la strada del multi threading: le implementazioni ufficiali di alcuni linguaggi (Ruby, Python...) hanno un lock globale che rende impossibile sfruttare i core/cpu dei moderni server - in queste situazioni la soluzione è la stessa usata dai server asincroni: più processi che comunicano tra di loro - aggiungendo comunque complessità Esiste una terza strada "Agents/Message passing" che viene sfruttata da Erlang ed esistono librerie per altri linguaggi (Java, Scala, Python, F#, non ho idea per C++...) il concetto è semplice: i task non condividono niente e si scambiano tra di loro messaggi per tenersi informati sui cambi di stato E' un approccio interessante perchè rende più facile il multi threading evitando la necessità di lock. E' anche da considerare che potenzialmente un server che sfrutta gli agents può distribuibile su più server il lavoro (ma in questo caso devi fare MOLTA attenzione alla lentezza che si introduce nella comunicazione server-server) I contro di questo approccio è l'overhead generato dal continuo scambio di messaggi tra i task Ad oggi la maniera più efficiente per scrivere server multithread è l'utilizzo dei threads con comunicazione tramite shared memory a costo di una complessità maggiore La scelta dipende principalmente dai tempi di sviluppo e da quanto costa mantenere un server più costoso/più server rispetto ai costi di sviluppo (ovviamente un server scritto in Erlang ha bisogno di più risorse dato un pari carico rispetto ad uno in C++ che usa i threads) Fare molta attenzione nel validare ciò che il server/client riceve - evita al minimo l'uso di puntatori (usa gli smart pointers/move semantics - supportati dalle ultime versioni di GCC e Visual Studio), usa parti della STD come string, non usare array ma preferisci i container STL come Vector Se prevedi che il tuo server avrà fortuna (parlo di tipo oltre 5000 utenti connessi) fai molta attenzione agli algoritmi che andrai ad usare (sopratutto il cambio di stato dei contatti) e le strutture dati utilizzate Non preoccuparti, la parte client è nettamente più semplice
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 Ultima modifica di nico159 : 10-04-2012 alle 19:21. |
|
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 6
|
io in realtà volevo soltanto realizzare una chat per poche persone,
dove i client si connettevano al server per chattare |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
In realtà non ci hai dato molte indicazioni di cosa hai bisogno... di cosa hai bisogno realmente in termini tecnici. Abbiamo capito che vuoi fare una chat. Ma che conoscenze hai e dove trovi problemi?
|
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 6
|
ho gia realizzato una chat ma solo per 2 persone. e volevo realizzare una chat con più persone e un server che ospitasse il tutto.
il mio problema era fare accedere più client allo stesso server |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quindi, e lo ripeto, il tuo problema sta nel creare un server multithreading?
|
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 6
|
esatto
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Allora prima di pensare alla chat comincia a capire bene come funzionano i thread. Da uno sguardo a questo tutorial che sembra davvero ben fatto.
http://www.yolinux.com/TUTORIALS/Lin...ixThreads.html Per il momento puoi arrivare a fare fino alla sincronizzazione dei thread (Thread Synchronization) Quando hai capito come funzionano continuiamo a parlare della chat e di come è possibile implementarla. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Non ho ben capito perchè vuoi usare C++ quanto mi pare capire che lo conosci in maniera molto vaga, ma sopratutto perchè non puoi usare chat server già esistenti
Quello che vuoi fare non è esattamente banale
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Secondo me invece è molto istruttivo creare una chat. Però per farla in un certo modo non banale sicuramente.
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Se è per poche persone comunque io userei python o java... Non ha senso sbattere la testa contro c++ per così poco carico, inoltre i concetti di base sono sempre quelli, non è difficile cambiare linguaggio a prototipo ultimato e funzionante.
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
|
|
|
|
|
|
#17 |
|
Junior Member
Iscritto dal: Apr 2012
Messaggi: 6
|
come è possibile utilizzare i thread per realizzare la chat
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Aug 2008
Città: Firenze
Messaggi: 317
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
Guarda il link che ti ho postato! In quel libro c'e' spiegato tutto quello che ti serve incluso come fare la chat coi thread!
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
|
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:26.




















