PDA

Visualizza la versione completa : Server UDP concorrente in C


MadAlex
12-02-2008, 12:33
Scusate l'ignoranza, ma ho un problemone.
Ho implementato un SW in C per delle virtual machine linux, di client/server UDP.
Ora, fin qui nessun tipo di problema. Definisco le porte, connetto il client al server e ho implementato tutti gli scambi di messaggi che mi occorrono.
Ora dovrei modificare il server, in modo da comportarsi come server concorrente, quindi gestire simultaneamente piu client!
avevo pensato di definire porte diverse (una x ogni client) ma ho il problema poi lato server.
Il problema che devo lavorare con UDP, quindi non so' se possibile fare delle fork(), non avendo la funzione listen(), ecc.. ecc...
Qualcuno potrebbe darmi qualche idea?
Vi prego!!!!!!!
Grazie in anticipo!

menphisx
12-02-2008, 16:23
3 alternative:
*Thread
*Fork
*Select

:ciauz:

MadAlex
12-02-2008, 16:55
Si, ok, ma per fare una fork() non ho bisogno dell'accept() che solo per tcp?
Io avevo pensato, non so se fattibile, di far arrivare tutti i client su di una porta del server (x es.9300) poi rispondere assegnandogli un altra porta (con una funzione random) in modo da avere una porta x ogni client, e far lavorare il server in parallelo.
Ho cercato su google di trovare un modo con le fork() per udp, ma ho trovato esempi di codice solo x TCP. Sai per caso dove posso trovare un esempio?
Ti premetto che solo un mese che utilizzo il C, e gia tirar su un client ed un server non stato banale, per me, ma lavorando con le virtual machine non mi posso permettere java....
Quindi, ok, grazie per il consiglio, ma non che hai un qualche esempio di come utilizzare la forck con UDP?
Grazie mille comunque

menphisx
12-02-2008, 17:14
no aspetta l'UDP connectionless, non c' bisogno di creare un processo per client.

:master: :ciauz:

MadAlex
12-02-2008, 17:25
Si, infatti, ecco perche' il mio problema. Ti spiego meglio, se io faccio partire su due shell 2 client verso il mio server, logicamente, vanno in conflitto, nel senso che mi ritrovo i 2 client che si spezzettano i pacchetti inviati dal server, in quanto hanno lo stesso socket e la stessa porta (quindi mi risultano come un client singolo).
Quindi, come ti dicevo, l'unica soluzione che mi viene quella dopo una prima connessione al server, farsi dare per i vari client da quest'ultimo porte distinete( una funzione random almeno evito sovrapposizioni), in modo da creare dei canali paralleli praticamente. Ora non so' se pero' cosi' sia fattibile, ci sto lavorando ancora.
Tanto i messaggi che si scambiano son sempre gli stessi, perche' mi serve come "Emulatore" per studiare praticamente i tempi dei vari pacchetti.
Grazie comunque, intanto mi hai tolto il dubbio che si potesse usare una fork().

menphisx
12-02-2008, 17:46
Trovato !
http://www.di.unito.it/~matteo/DIDATTICA/aa05/RdE/risorse.html

billiejoex
12-02-2008, 19:30
Si, ok, ma per fare una fork() non ho bisogno dell'accept() che solo per tcp?
No, non c'entra.
Quello che tipicamente fai mettere l'accept() all'interno di una fork o di un thread in quanto accept() bloccante, ma questo vale per qualunque chiamata di questo tipo (bloccante).


Io avevo pensato, non so se fattibile, di far arrivare tutti i client su di una porta del server (x es.9300) poi rispondere assegnandogli un altra porta (con una funzione random) in modo da avere una porta x ogni client, e far lavorare il server in parallelo.
No, utilizzando UDP "lato server" non hai pi una accept() ma una unica recv()/recvfrom() che richiami di continuo la quale ti ritorna i dati ricevuti e l'indirizzo del mittente.
Non so di preciso quale sia il tuo problema e sar almeno 2 anni che non vedo UDP ma in genere quello che si fa con un server UDP essenzialmente quello, quindi non credo tu abbia neanche bisogno di utilizzare fork, thread, select e compagnia.


Ti premetto che solo un mese che utilizzo il C, e gia tirar su un client ed un server non stato banale, per me, ma lavorando con le virtual machine non mi posso permettere java....
Infatti quello che consiglio sempre di non utilizzare C n tanto meno lavorare con socket, fork, thread e select nativamente per fare questo genere di cose.
Un mucchio di lavoro extra che un linguaggio di pi alto livello con l'ausilio di un framework di rete ti eviterebbe.

MadAlex
13-02-2008, 10:09
Ok, grazie ad entrambi. Ora provo a vedere se impostando porte decicate per ogni client riesco a risolvere.

Loading