2012-05-23 25 views
5

Necesito aceptar múltiples conexiones al mismo puerto. Estoy usando socket en C++, quiero hacer algo como lo hago con SSH. Puedo hacer un usuario ssh @ machine "ls -lathrR /" y ejecutar otro comando en la misma máquina, incluso si el primero aún se está ejecutando.Múltiples conexiones en el mismo socket de puerto C++

¿Cómo puedo hacer eso?

Gracias.

+0

Si no es para entender la programación del socket, sugiero no usar enchufes simples. En su lugar, use un marco de red. [ACE] (http://www.cs.wustl.edu/~schmidt/ACE-overview.html) o [ZeroMQ] (http://www.zeromq.org/). Inicialmente parece una buena idea hacer tomas de vainilla, pero se vuelve desordenado con el tiempo. – Vikas

+0

Traté de escuchar el puerto de nuevo en otro hilo, pero no funcionó, dice que el puerto está en uso, así que le pregunté;) – Lefsler

+0

No hay nada especial que deba hacer. Todavía estás escuchando, así que no intentes escuchar de nuevo. –

Respuesta

10

Lo que quiere es un servidor de socket multiproceso.

Para esto, necesita un hilo principal que abre un socket para escuchar (y espera las conexiones entrantes del cliente). Esto tiene que entrar en un ciclo while de algún tipo.

Luego, cuando un cliente se conecta, se desbloquea la función accept() y en ese momento debe atender la solicitud del cliente pasando la solicitud a un hilo que se ocupará de ella.

El lado del servidor se reiniciará y esperará a que se produzca otra conexión mientras el hilo anterior realiza su tarea.

Puede crear subprocesos según lo necesite o utilizar un grupo de subprocesos que podría ser más eficiente (ahorrando tiempo inicializando nuevos subprocesos).

Eche un vistazo a here para obtener más detalles. Busque el socket del servidor multiproceso en la web, específicamente bind(), listen() y accept() desde el lado del servidor.

+0

Lo intentaré, porque si quiero conectarlo dice que la dirección ya está en uso. – Lefsler

+0

esto puede ocurrir si está intentando vincular al puerto que ya está siendo utilizado por otra aplicación. ¿En qué puerto están tratando de escuchar? – fduff

+0

Necesito 2 aplicaciones para enviar datos al mismo puerto, como lo hace ssh cuando envía más de 1 comando al mismo tiempo. – Lefsler

1

Necesita leer en ::listen() y ::accept().

El primero configurará su zócalo para escuchar. Luego necesita un bucle (probablemente en su propio hilo) que usa ::accept() que volverá cada vez que llegue una nueva conexión.

Ese bucle debe engendrar un nuevo hilo al que debe pasar el descriptor de archivo recibido desde ::accept() y luego maneja todas las E/S en ese socket desde allí.

0

La pregunta anterior es antigua, pero siento que nadie que respondió entendió la pregunta del OP.

No está entendiendo cómo funciona ssh. Cuando envía múltiples comandos/conexiones múltiples a un servidor a través de ssh, en realidad solo hay UN programa en el servidor al que se está conectando que recibe todos esos comandos.

Sshd (el ssh daemon) se ejecuta en el servidor, y es un servidor de socket multiproceso (vea la respuesta de fduff). Este es el único programa que escucha en el puerto 22 y maneja todas las conexiones ssh entrantes por sí mismo.

+0

Gracias Conslo, pero ya resolví el problema hace meses. – Lefsler

Cuestiones relacionadas