2013-04-12 7 views
5

Scrivo sull'applicazione server/client UDP.Associazione di 40 socket a 40 indirizzi IP diversi

Voglio che il mio server singolo gestisca 40 client alla volta. Per questo, voglio creare 40 thread dedicati, ciascuno dedicato a un singolo cliente. Dato che ci sono 40 thread uno per ogni cliente, voglio creare anche 40 socket dedicati.

Ma il problema che:

Non so quale sarà il 40 indirizzi IP a cui io bind() i miei zoccoli. (Dal momento che per ora, devo legare() all'indirizzo IP del mio server.) Normalmente lego() a "INADDR_ANY" quando c'è solo un singolo socket.

Ma quali dovrebbero essere gli indirizzi IP a cui dovrei legare() ciascuna delle mie 40 prese? Per favore aiutatemi. Ogni commento/aiuto è apprezzato.

+0

Avete bisogno di 40 prese (indirizzi socket) o 40 indirizzi IP? Il tuo ospite ne avrà così tanti? –

risposta

2

Un modo comune di fare questo con UDP è:

  • server BIND() per una porta nota.
  • Il client invia il pacchetto iniziale a quella porta nota
  • Il server riceve il primo pacchetto da un client sulla porta conosciuta.
  • Il server crea un nuovo socket con una porta casuale
  • Il server risponde al client da questo nuovo socket.
  • Il client riceve la risposta, nota che proviene da un'altra porta rispetto alla nota porta del server e utilizza quella porta come destinazione per ulteriori comunicazioni.

Utilizzerai la chiamata getpeername() per imparare l'indirizzo remoto.

Ricorda che UDP è senza connessione, ti servirà un modo per segnalare la fine o il timeout delle prese.

1

Il modo usuale è quello di bind un singolo socket e accept connessioni in entrata. Ad ogni connessione verrà assegnato un socket univoco accetto.

Poiché si utilizza UDP, utilizzare semplicemente TCP come descritto in precedenza per consentire ai client di conoscere i rispettivi indirizzi UDP del server.

+1

accept() è per tcp mentre sto lavorando su UDP. – Ayse

+0

È il requisito del mio sistema per creare 40 socket. Ora il problema è che non so quali indirizzi IP debbano essere bind() ed a questi 40 socket :( – Ayse

+0

@Ayesha Hassen: ho aumentato la mia risposta all'indirizzo UDP –

2

bind richiede solo l'indirizzo locale, non l'indirizzo remoto.

Se si desidera un socket per ciascun client, sarà necessario utilizzare porte diverse per ciascuna (utilizzando bind). In questo modo, ogni client può inviare il proprio traffico a una porta dedicata e si può avere un thread per ogni socket/porta.

Probabilmente è un'idea migliore avere solo un socket (e una porta), e avere una logica nel codice per assegnare il traffico a un thread basato sull'indirizzo remoto (recuperato usando recvfrom ad es.).

+0

Se c'è solo un singolo thread e tutto il 40 client inviano i dati simultaneamente su questo singolo socket, ci sono possibilità che i dati di ogni cliente possano essere sganciati Per questo motivo, ho spostato verso la creazione di socket dedicati per ciascun client. – Ayse

+1

Se vuoi davvero socket dedicati, ho spiegato come Non capisco perché pensi che i dati verrebbero eliminati se usi solo un socket. –

+0

Grazie per il tuo aiuto :) mi ha davvero aiutato :) Una cosa che voglio sapere è che cosa sono i svantaggi se creo 40 thread/socket invece di un thread di ascolto. tutti sembrano essere contrari a questa idea. Ci sono delle solide ragioni alla base di questo? Perché non si dovrebbe creare 40 thread/socket dedicati per ciascun client e concentrarsi sulla creazione di un socket? :( – Ayse

1

Creare un singolo socket di ascolto in un thread di ascolto dedicato.

Quando riceve un nuovo pacchetto, utilizza l'indirizzo/porta remota del pacchetto o inserisce un ID client univoco nel payload del pacchetto, per identificare in modo univoco il client.

Creare un nuovo thread per quel client se uno non esiste già, passare il pacchetto a quel thread per un'ulteriore elaborazione e tornare all'ascolto.

Se un determinato thread client non riceve alcun pacchetto per un po ', può terminare da solo.