2010-06-06 4 views
5

Ho bisogno di scrivere un server che accetta connessioni da più macchine client, mantiene traccia dei client connessi e invia i dati dei singoli client secondo necessità. A volte, tutti i client possono essere contattati contemporaneamente con lo stesso messaggio, altre volte, può essere un singolo cliente o un gruppo di clienti.Connessioni prese multiple

Poiché ho bisogno di confermare che i client abbiano ricevuto le informazioni e non vogliano costruire una struttura ACK per una connessione UDP, ho deciso di utilizzare un metodo di streaming TCP. Tuttavia, ho faticato a capire come mantenere più connessioni e mantenerle inattive.

Mi sembra di avere tre opzioni. Utilizzare un fork per ogni connessione in ingresso per creare un processo figlio separato, utilizzare pthread_create per creare un thread interamente nuovo per ogni processo o utilizzare select() per attendere su tutti gli ID socket aperti per una connessione.

Raccomandazioni su come attaccare questo? Ho iniziato a lavorare con i pthread, ma dal momento che le prestazioni probabilmente non saranno un problema, l'elaborazione multicore non è necessaria e forse c'è un modo più semplice.

+0

Come nota, sto lavorando in C/C++ – BSchlinker

+0

Vorrei anche ricordare che il numero di connessioni a questo sistema è statico. Questa non è una macchina pubblica (le connessioni non cambieranno nel tempo, ad esempio, non vedo problemi di prestazioni come un problema). – BSchlinker

+1

Personalmente, vorrei usare multiplex usando select(), o preferibilmente kqueue() se in esecuzione su mac o bsd. Entrambe le tre opzioni funzionerebbero, tuttavia, e le opzioni pthread/fork sono semplicissime da implementare se il tuo server avrà un basso numero di client e un basso contenimento attivo del client. –

risposta

5

I processi figli non sono piacevoli, perché basta spostare il palo. Avrai bisogno di far comunicare tra loro i processi del tuo bambino, quindi tornerai allo stesso problema.

È possibile utilizzare thread, ma si avranno altri problemi se i thread continuano a bloccarsi in ricezione socket.

select() (o poll() sui nuovi (POSIX) Unix) è ancora la soluzione migliore. Si dice select() o poll() quali socket o descrittori si desidera monitorare per gli eventi (probabilmente solo gli eventi di input (lettura) sono sufficienti per voi), quindi si legge solo su quel socket o descrittore che è stato contrassegnato da select()/sondaggio(). È garantito che recv() non bloccherà.

4

Leggi la pagina C10K per un sacco di opzioni. Quindi leggi l'articolo High Performance Server Architecture. Questi risponderanno a molte domande per te.

Vorrei andare con la terza opzione. Per quello sguardo in epoll(4) e/o kqueue(2) strutture per moderni performanti select/poll sostituzioni.

+0

+1 per epoll(). Potresti anche dare un'occhiata a boost :: asio, che sottrarrà gran parte del lavoro. – Thanatos

+1

Sì, 'boost :: asio' è una delle opzioni per C++. È menzionato nelle pagine che ho linkato. –