2009-09-18 12 views
8

Sto scrivendo un semplice programma client-server.come differenziare se il client utilizza TCP o UDP dal lato server

Il client invia alcuni messaggi al server utilizzando UDP o TCP. Il server deve essere in grado di supportare sia UDP che TCP.

Se il client invia un messaggio utilizzando UDP, la sequenza di chiamate di metodo nel client è socket(),bind(),sendto(),recvfrom(),close() e quella nel server è socket(),bind(),sendto(),recvfrom(),close().

Se utilizza TCP, la sequenza di chiamata nel server è socket(),bind(),listen(),accept(),send(),recv(),close(). e che nel client sia socket(),bind(),connect(),send(),recv(),close()

Nel mio programma, l'utente/cliente è data scelta in partenza per selezionare quello che si desidera utilizzare UDP o TCP. Quindi, il mio problema principale è come posso sapere o differenziare sul lato server, se il client sta inviando un messaggio usando TCP o UDP. Se usa TCP, devo chiamare listen(), accept(), send(), recv() e se usa UDP, non chiamo listen(), accept() ma inviamo sendto() e recvfrom ().

Quindi, come posso differenziarlo/sapere questo all'inizio così da poter effettuare chiamate di funzione appropriate.

Grazie.

+1

Quindi, dovrei creare due socket sul lato server, uno per UDP e un altro per TCP? –

+0

seg.server.fault, sì. –

+2

@ seg.server.fault: vorrei raccomandare _non_ chiamando 'bind()' nel codice cliente. Sebbene sia tecnicamente possibile (e richiesto in situazioni molto specifiche), il comportamento predefinito senza 'bind() sul lato client è solitamente quello che si desidera a livello dell'applicazione. Inoltre, tieni presente che _can_ chiama 'connect()' su un socket UDP. Non fa alcun handshaking, ma vuol dire che puoi usare 'send/recv' invece di 'sendto/recvfrom', il che può finire per semplificare la logica del client. – Tom

risposta

15

prima che il pacchetto lo raggiunge, non si sa se è UDP o TCP.

Quindi si desidera associare entrambi i socket UDP ese si prevedono richieste in entrambe le direzioni.

Una volta che hai fatto, sai solo da che parte proviene il socket che hai ricevuto il pacchetto.

1

solo lasciare che il socket TCP in ascolto sulla porta X, e fare le connessioni UDP attraverso la porta Y

+6

è possibile ascoltare in modo sicuro su UDP e TCP sulla stessa porta. –

5

Quando si crea la presa, si passa un tipo - SOCK_STREAM (TCP) o SOCK_DGRAM (UDP)

Così i due tipi di traffico saranno in due prese differenti.

+0

Questo non aiuta il lato server. L'OP sa già che il lato client deciderà TCP rispetto a UDP. Il problema è supportarli entrambi sul lato server, e questo è uno sforzo decisamente maggiore rispetto alla semplice modifica del tipo di socket. – Tom

Problemi correlati