Interazione Server-Client

di il
13 risposte

Interazione Server-Client

Salve ragazzi! come si puo' coordinare l'invio di dati tra server/clients in modo costante e piu' veloce possibile? Attualmente sto smanettando con la programmazione di rete con le SFML(a quanto la mia prof sostiene che non cambia molto tra socket(TCP) del C e SFML), ma ho riscontrato un problema abbastanza grave.
Il mio programma deve passare ad uno stato "avanzato", cioe' non deve piu' scambiare informazioni in modo "calmo e tranquillo" (es. se arriva un comando il server risponde in modo semplice), ma in modo costante e sincronizzato tra i vari client/server, contando anche che la velocita' di ognuno di essi varia da computer a computer.
Esempi comuni del tipo di server che vorrei realizzare sono:
Browser games high motion
Applicazioni interattive high motion(collegate ad internet)
Piu' o meno tutti i server di videogames
Server di comunicazione
Esempi di server "calmi" (o "richiesta e risposta"):
Normali siti web
Applicazioni internet low motion
I programmi comuni che si fanno in classe (*che faro', studiero' la programmazione di rete in 5°, e attualmente sono a meta' 3°.)

Se non sono stato chiaro provero' ad esprimermi meglio..


Inoltre, quando si manda un messaggio che contiene uno spazio(esempio "Hello World"), il buffer viene spezzato in 2:
in un codice come questo

//Programma ricevente(server, in questo caso)

    while (message != "Send")
    {

        socket.receive(buffer, sizeof(buffer), received);
        message = buffer;
        cout <<message<< endl;
        if (message == "Send")
        {
            message = "Received Send";
            cout <<message<< endl;
        }

    }

uscirebbe

Hello
World

Questo causa che, se mandassi il messaggio "Ciao pinco pallino Send" il server scrive:

Ciao
pinco
pallino
Send
Received Send //Riceve effettivamente la parola "Send", e il programma si chiude.

Grazie delle eventuali risposte

13 Risposte

  • Re: Interazione Server-Client

    Il problema e' in realta' un tuo problema, nel senso che non hai abbastanza conoscenze per affrontare la complessita' che richiede la soluzione.

    La soluzione implica l'utilizzo del multithreading, del I/O asincrono, dell'utilizzo di code per supportare client o server troppo veloci/troppo lenti rispetto alla velocita' di elaborazione della controparte ... e di infiniti altri dettagli, ivi compreso come funziona una connessione TCP/IP quando la velocita' di trasmissione e' superiore al timeout di svuotamento del buffer del driver della scheda di rete.

    Dare una risposta in un post e' impossibile: vuol dire concentrare interi libri (non uno, ma diversi) in qualche centinaio di parole.

    Continua a studiare, niente e' irrealizzabile. L'unico limite e' la propria fantasia

    Se fosse facile, lo saprebbe fare chiunque. Dove starebbe il divertimento?
  • Re: Interazione Server-Client

    Per quanto riguarda il problema di spezzettamento delle stringhe (o meglio, dei pacchetti) si tratta di un problema (o meglio, caratteristica) tipica dei socket.
    Non so come la tua prof intenda farti lavorare e non so nemmeno cosa ti abbia spiegato: ad ogni modo la libreria SFML dovrebbe fornirti una gestione a più alto livello (vedi http://www.sfml-dev.org/tutorials/2.3/network-packet.php) che dovrebbe risolvere i problemi come lo spezzettamento dei pacchetti:

    The third problem is specific to how the TCP protocol works. Because it doesn't preserve message boundaries, and can split or combine chunks of data, receivers must properly reconstruct incoming messages before interpreting them. Otherwise bad things might happen, like reading incomplete variables, or ignoring useful bytes.

    Prova a parlarne con la prof.
    Buono studio
  • Re: Interazione Server-Client

    Che argomenti dovrei studiare per arrivare a capire e creare quello che vorrei fare? Meglio avere davanti un monte con segnali che un monte dove non batte il sole.
    Il mio prof di TPS(la materia dove in 5° studiero' la programmazione di rete) mi ha risposto in maniera molto simile, mi ha detto che per gestire piu' client servirebbe la programmazione multithreading. E stessa cosa per il resto, il prof di lab di informatica ha detto che ci sono libri mammut per spiegare quello che vorrei effettivamente realizzare.
  • Re: Interazione Server-Client

    E quindi... arriva da solo alle conclusioni...
  • Re: Interazione Server-Client

    E quindi in generale ci vuole molto xD
    Ma quali argomenti dovrei sudiare? Almeno posso iniziare a documentarmi e capire quanto e cosa studiare.
  • Re: Interazione Server-Client

    Dovrei anche aggiungere che non voglio fare una cosa perfetta e articolata. Mi serve per capire il meccanismo e applicarlo alla base, al perfezionamento del programma passo dopo. Diciamo che e' un "prototipo" di un server, giusto per avere in mente -quando passero' seriamente su questo argomento- come deve essere fatto. E poi, essendo un tipico geek che non fa sport, ho tanto tempo dopo scuola da sprecare, posso sacrificare partite a videogames online e mettermi a leggere libri sul c++. Ho comprato proprio per questo "Programmazione in C++", di Steve Oualline (secondo voi e' buono come libro per iniziare?), di cui le prime 100 pagine le ho mangiate in 2 secondi.
  • Re: Interazione Server-Client

    Chi ha detto che i socket spezzettano le stringhe per spazi?
    Come accennato da @Candaluar i socket vengono spezzettati in base alle dimensioni e altri fattori ma non certo Perché contengono degli spazi!
    Penso che il problema sia dato dalla classe che stai usando, non dal socket.

    Chi ha detto che per gestire più client ci vuole il multithreading? e/o Multitasking?
    Basta un solo processo! è le modalità asincrone, molto più semplici e "leggeri" del multitasking/multithreading.

    L'argomento è molto vasto e partire dalla cosa più complessa non è una buona scelta, io partire dal creare un server web, il lavoro è abbastanza semplice e si trova molta documentazione ma soprattutto so trovano i codici sorgenti! ad esempio si potrebbe studiare "uHTTPd".
  • Re: Interazione Server-Client

    Non credo affatto sia un problema di spazio. Il buffer ha 2000 caratteri (vettore) e se mai ho scritto 30 caratteri e' gia' troppo
    La classe invece.. Beh, non ne ho idea, so per certo che la classe e' la sf::TcpSocket, ma non so come funziona all'interno della classe. In effetti, non so quasi niente delle classi.. Uno di questi giorni converto qualche mio bel programma(ad esempio ne ho uno dove un triangolo punta verso il mouse e se cliccato il tasto sinistro lo segue, ma e' davvero scritto malissimo, ci ho messo tutta la mia "cattiveria" ) con le classi e imparo come funzionano, almeno le basi. Se non sbaglio, dovrebbero assomigliare a dei record.
  • Re: Interazione Server-Client

    Forse non mi sono spiegato, quando tu invii dei dati il S.O. decide come impacchettarli ed inviarli, ad esempio se invii "ciao" potrebbe essere prima inviato "c" poi "ia" e poi "o", a prescindere che tu abbia un vettore di 1,100,1000.
    Questo dipende da tanti fattori, inutile illustrarli in questa sede.
    Ma il S.O. di certo non analizzerà se il pacchetto che invii ha spazi o meno, anche perché non sa neppure che sia una stringa!

    Il primo consiglio è di non usare classi già fatte, ma di imparare direttamente ad usare le api/systemcall del proprio S.O.
    Allora potrai scegliere quale classe usare solo e soltanto dopo aver letto TUTTA la documentazione della classe stessa.
  • Re: Interazione Server-Client

    Ma guide per i socket in c sono abbastanza rare e in inglese capisco solo il 90% delle cose ç.ç (Voglio dire, in realta' capisco praticamente tutto, ma ci vuole un bel po' per elaborare l'inglese nel mio cervello. Attualmente la mia cache ha pochi MB di italiano e forse solo 1 per l'inglese, anche se e' in costante aumento.)
    E poi.. i socket con le SFML sembrerebbero molto piu' semplici, e sono uguali sia per linux che per windows. Attualmente uso W10 ma prima o poi Debian o -sotto continua insistenza della mia prof- Slackware sarnno i principali OS del mio pc. Anche se linux non e' proprio una passeggiata da imparare ò.ò
  • Re: Interazione Server-Client

    No, non uso 3 sistemi operativi.. Senza contare a scuola(dove usiamo slackware) uso solo w10. Ma POTREI passare a linux, debian O slackware.
    Perche' slackware e' piu' potente? Io sinceramente lo trovo molto scomodo (da parte di un normale utente, non programmatore), perche' per fare certe operazioni bisogna fare tutto a mano, senza usare comandi brevi di debian, ad esempio. (Debian c'e' gia' stato nel mio pc, ma per problemi di drivers non l'ho tenuto.. Sono pigro e non ho voglia di installarli tutti manualmente xD)
    Inoltre Debian e' molto piu' comune, e molte guide linux sono ottimizzate proprio per esso.

    Comunque, senza andare off topic, perche' e' cosi' compicato coordinare semplicemente un client e un server? A me sembra ci possa essere un concetto davvero semplice.. Esattamente come far apparire un'immagine nello schermo, quando lo chiedevo alla prof sembrava che ci volessero millenni di duro studio, invece basta un pizzico di logica..
    E a scuola si fa troppo poco e troppo ripassato: per ogni argomento spendiamo circa 1-3 mesi di esercizi vari abbastanza inutili per chi ha capito il concetto di "vettori" o "record".
  • Re: Interazione Server-Client

    Hai qualche soluzione sul perche' dello "spezzare" la stringa dallo spazio? Magari non e' proprio quello che fa, ma almeno da parte dell'utente e' quello che sembra. Dipende dal OS? SFML? Socket del C? O e' un semplice errore mio? (Se vi puo' servire posto entrambi i codici)
    E quali argomenti devo sapere bene? Appena finiro' il libro del c++(questa e' stata una settimana drastica, non ho avuto tempo di continuarlo) cosa devo studiare ancora? Nel libro non accenna neanche alla programmazione di rete. Ma ripassa bene svariati argomenti come le classi (che, mi vergogno a dirlo ma non le so ancora usare anche se so cosa sono.. datemi una settimana e sapro' almeno le basi).
  • Re: Interazione Server-Client

    wrugg25 ha scritto:


    Devid1910 ha scritto:


    E quali argomenti devo sapere bene?

    Il mio punto di vista l'ho già espresso: devi sapere che ti devi stare fermo

    Ma se proprio vuoi fare la cosa sbagliata, questo è un libro che potrebbe esserti utile, fermo restando che dovresti prima aver acquisito i contenuti trattati nei corsi universitari di "Reti di calcolatori" & capitoli successivi: http://www.amazon.com/TCP-Sockets-Second-Edition-Programmers/dp/0123745403
    E dovrei aspettare anni solo per iniziare l'universita'? Sinceramente, videogames/sport/altre attivita' non riuscirebbero a tenermi occupato.. Ho bisogno di fare qualcosa di utile e che rimanda nell'ambito della scienza, e la programmazione e' quella che gestira' il mio futuro. Non ce la farei a stare 1 settimana senza fare almeno un programma(salvo quelli di scuola).
Devi accedere o registrarti per scrivere nel forum
13 risposte