Lo que intento resolver: tener un servidor TCP de Erlang que escuche en un puerto específico (el código debe residir en algún tipo de interfaz externa/API) y cada conexión entrante debe ser manejada por un gen_server
(es decir, incluso el gen_tcp:accept
debe estar codificado dentro del gen_server
), pero en realidad no quiero generar inicialmente un número predefinido de procesos que acepte una conexión entrante). ¿Es eso de alguna manera posible?Erlang aceptar dinámicamente conexiones tcp entrantes
Respuesta
Usted debe tener una estática gen_server
(o cualquier otro proceso) que escucha conexiones entrantes utilizando accept
y cada vez que reciba una conexión, decirle a un supervisor para desovar de un trabajador gen_server
. Obtenga el pid para este proceso, llame al gen_tcp:controlling_process/2
con ese pid y luego envíe el socket que obtuvo de accept
a ese proceso (debe hágalo en ese orden, de lo contrario, el nuevo proceso podría usar el socket antes de que se haya entregado) .
El proceso de escucha solo debe tener una responsabilidad, y eso es escuchar nuevas conexiones. Por eso, no importa si bloquea, por lo que podría ser un gen_server
o cualquier otro proceso. De hecho, probablemente sea excesivo tenerlo como gen_server
, sería más simple y más rápido comenzar un proceso bare-bone proc_lib
en su lugar.
El problema con gen_tcp:accept
es que bloquea, por lo que si lo llama dentro de un gen_server
, bloquea el servidor para que no reciba otros mensajes. Puede tratar de evitar esto pasando un tiempo de espera pero, en última instancia, equivale a una forma de votación que es mejor evitar. En cambio, puede intentar Kevin Smith's gen_nb_server en su lugar; usa una función interna no documentada prim_inet:async_accept
y otras funciones prim_inet
para evitar el bloqueo.
Pero si puedo encontrar una forma de retransmitir el 'gen_tcp: accept' dentro de su gen_server, no me importaría que esté bloqueando. Pero supongo que no es posible saber por adelantado (digamos desde 'gen_tcp: listen') que tiene una conexión entrante que debe aceptar. Gracias por el puntero a 'gen_nb_server'! ¿Lo has usado en producción? – hyperboreean
No creo que necesite 'gen_nb_server' para lo que está haciendo. Tu caso es muy simple. –
Nunca he usado 'gen_nb_server' en producción pero he usado' prim_inet: async_accept' en producción. –
Deberías usar "prim_inet: async_accept (Listen_socket, -1)" como dice Steve. Ahora la conexión entrante sería aceptada por su call_info callback (asumiendo que su interfaz también es un gen_server) ya que ha usado una llamada asincrónica accept.
Al aceptar la conexión que puede generar otra ger_server (recomendaría gen_fsm) y hacer que a medida que el "proceso de control" llamando "gen_tcp: controlling_process (CliSocket, pid del proceso spwned)".
Después de esto, todos los datos del socket serían recibidos por ese proceso en lugar de por su código de interfaz. Al igual que un nuevo proceso de control se generará para otra conexión.
Simplemente corte y pegue desde otro lugar sin atribución. –
Sí, lo he cortado y pegado desde mi propia aplicación erlang. ¿Necesito tomar permiso de mí para eso? – Arunmu
Lo siento, parecía un fragmento de un diálogo de lista de correo en la primera vista. –
Es posible que desee comprobar http://github.com/oscarh/gen_tcpd y utilizar la función handle_connection para convertir el proceso que obtiene a gen_server.
- 1. boost :: asio: ¿Cómo uso async_accept para aceptar conexiones entrantes?
- 2. Cómo configurar PostgreSQL para aceptar todas las conexiones entrantes
- 3. Java socketserver: ¿Cómo manejar muchas conexiones entrantes?
- 4. Delphi: Limitando conexiones TCP
- 5. Cómo detectar conexiones entrantes en mi módem
- 6. Sockets TCP y POSIX aceptar() semántica
- 7. ¿Tenedor antes o después de aceptar conexiones?
- 8. ¿Cómo debo usar AsynchronousServerSocketChannel para aceptar conexiones?
- 9. Creando conexiones de 100,000 tcp usando .NET
- 10. conexiones TCP cuelgan sobre el estado CLOSE_WAIT
- 11. Apache - manejo de conexiones TCP, pero no solicitudes HTTP
- 12. cómo aceptar certificados autofirmados para conexiones JNDI/LDAP?
- 13. En Erlang, ¿cómo invocas dinámicamente una función?
- 14. ¿Las conexiones TCP se mueven a otro puerto después de que se abren?
- 15. Winsock: deje de aceptar nuevas conexiones pero mantenga la comunicación con las conexiones existentes.
- 16. ¿Cuál sería la forma de Spring de usar conexiones TCP?
- 17. Conexiones TCP abiertas simultáneas en el servicio WCF
- 18. Conexiones tcp/ip máx. En Windows Server 2008
- 19. ¿Cómo retener un millón de conexiones TCP simultáneas?
- 20. Estrategia de Erlang Supervisor para reiniciar conexiones a hosts reducidos
- 21. ¿Puede un servidor Node.js aceptar solicitudes entrantes mientras la cola de eventos está bloqueada?
- 22. desbloquear un Winsock Bloqueado aceptar() Llame a
- 23. ¿Número máximo de puertos abiertos simultáneos de Erlang?
- 24. cómo administrar conexiones a bases de datos creadas dinámicamente
- 25. ¿Cómo propagar las conexiones entrantes de tcplistener a través de subprocesos en .NET?
- 26. Reconexión automática a un host TCP
- 27. que usa un puerto TCP?
- 28. Conozca el tamaño de aceptar la cola de conexiones pendientes en GNU/Linux
- 29. ¿Por qué mi programa ActivePerl en Windows deja de aceptar conexiones de socket?
- 30. Erlang - C y Erlang
Gracias, voy a probar este enfoque, ya que parece el más factible – hyperboreean