PDA

View Full Version : [C++] Creare chat con più persone


bonino33
10-04-2012, 13:01
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.

sal_rob
10-04-2012, 13:17
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.

ingframin
10-04-2012, 14:21
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...

WarDuck
10-04-2012, 14:31
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)...

bonino33
10-04-2012, 14:32
il mio problema è quello di fare in modo che più client potesssero accedere a un unico server.

clockover
10-04-2012, 16:37
il mio problema è quello di fare in modo che più client potesssero accedere a un unico server.

Hai problemi ad implementare un server multithreading?

nico159
10-04-2012, 16:54
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.
Devi realizzare anche un server? Se sì la faccenda si fa più complicata

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 :rolleyes:

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/doc/html/boost_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 :sofico:

bonino33
10-04-2012, 17:45
io in realtà volevo soltanto realizzare una chat per poche persone,
dove i client si connettevano al server per chattare

clockover
10-04-2012, 17:48
io in realtà volevo soltanto realizzare una chat per poche persone,
dove i client si connettevano al server per chattare

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?

bonino33
10-04-2012, 18:01
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

clockover
10-04-2012, 18:03
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

Quindi, e lo ripeto, il tuo problema sta nel creare un server multithreading?

bonino33
10-04-2012, 18:08
esatto

clockover
10-04-2012, 18:16
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/LinuxTutorialPosixThreads.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.

nico159
10-04-2012, 19:59
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

clockover
10-04-2012, 20:02
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

Secondo me invece è molto istruttivo creare una chat. Però per farla in un certo modo non banale sicuramente.

ingframin
11-04-2012, 08:14
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.

bonino33
12-04-2012, 13:40
come è possibile utilizzare i thread per realizzare la chat

Mulder90
12-04-2012, 19:04
come è possibile utilizzare i thread per realizzare la chat

non ha aperto nemmeno i link....:asd: :asd: :asd:

ingframin
13-04-2012, 17:39
come è possibile utilizzare i thread per realizzare la chat

:doh: :muro:

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!

clockover
13-04-2012, 17:41
:doh: :muro:

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!

sei matto... tutte quelle pagine :D :D :doh:

kevinpirola
14-04-2012, 03:12
dalla mia esperienza con java, fare una chat è una cosa abbastanza semplice

basati sul protocollo irc che è molto semplice (rfc 1459)

un semplice client di poche righe si connette facilmente (certo poi devi fare la parte di interfacciamento con lìutente che non è uno scherzo) e il server che smista i messaggi non è un grossissimo problema soprattutto se gli dai poche funzioni.