2012-05-23 12 views
5

Devo accettare più connessioni alla stessa porta. Sto usando il socket in C++, voglio fare qualcosa come fare l'SSH. Posso eseguire un utente ssh @ machine "ls -lathrR /" ed eseguire un altro comando sulla stessa macchina, anche se il primo è ancora in esecuzione.Connessioni multiple sullo stesso socket della porta C++

Come posso farlo?

Grazie.

+0

Se non è per la comprensione della programmazione socket, suggerirei di non utilizzare prese normali. Usa invece un framework di rete. [ACE] (http://www.cs.wustl.edu/~schmidt/ACE-overview.html) o [ZeroMQ] (http://www.zeromq.org/). Inizialmente sembra una buona idea fare prese di corrente, ma nel tempo diventa complicato. – Vikas

+0

Ho provato ad ascoltare nuovamente la porta in un'altra discussione, ma non ha funzionato, dice che la porta è in uso, quindi ho chiesto;) – Lefsler

+0

Non c'è niente di speciale che devi fare. Stai ancora ascoltando, quindi non provare ad ascoltare di nuovo. –

risposta

10

Quello che vuoi è un server socket con multithreading.

Per questo, è necessario un thread principale che apre un socket per ascoltare (e attende connessioni client in ingresso). Questo deve andare in un ciclo temporale di qualche tipo.

Quindi, quando un client si connette ad esso, la funzione accept() si sbloccherà e a quel punto sarà necessario servire la richiesta del client inoltrando la richiesta a un thread che ne tratterà.

Il lato server eseguirà un loopback e attenderà un'altra connessione mentre il thread precedente svolge il proprio compito.

È possibile creare thread come necessario oppure utilizzare un pool di thread che potrebbe essere più efficiente (risparmiando tempo per inizializzare nuovi thread).

Dai un'occhiata a here per ulteriori dettagli. Cercare socket del server con multithreading sul Web, in particolare bind(), listen() e accept() dal lato server.

+0

Ci proverò, perché se voglio collegarlo dice l'indirizzo già in uso. – Lefsler

+0

questo può accadere se si sta tentando di collegarsi a una porta già in uso da un'altra applicazione. quale porta sta cercando di ascoltare? – fduff

+0

Ho bisogno di 2 applicazioni per inviare i dati alla stessa porta, come fa ssh quando invii più di 1 comando contemporaneamente. – Lefsler

1

È necessario leggere su ::listen() e ::accept().

Il primo configurerà il socket per l'ascolto. È quindi necessario un ciclo (probabilmente nella sua stessa thread) che utilizza ::accept() che verrà restituito ogni volta che arriva una nuova connessione.

Quel ciclo dovrebbe quindi generare un nuovo thread a cui si deve passare il descrittore di file ricevuto da ::accept() e quindi gestisce tutti gli I/O su quel socket da esso.

0

La vecchia domanda è vecchia, ma credo che nessuno che ha risposto abbia capito la domanda dell'OP.

Stai fraintendendo il modo in cui funziona ssh. Quando si inviano più comandi/più connessioni a un server su SSH, in realtà c'è solo UN PROGRAMMA sul server a cui ci si sta collegando che sta ricevendo tutti quei comandi.

Sshd (il daemon ssh) viene eseguito sul server ed è un server socket con multithreading (vedere la risposta di fduff). Questo è l'unico programma che ascolta sulla porta 22 e gestisce tutte le connessioni ssh in ingresso da solo.

+0

Grazie Conslo, ma ho già risolto il problema mesi fa. – Lefsler

Problemi correlati