La comprensión inicial del servidor iterativo y del servidor concurrente

  

es relativamente primitiva, su prototipo se puede describir como:
while (1) {new_fd = servidor acepta conexión de cliente (new_fd = accept (listenfd, XX, XX)) El procesamiento lógico envía un mensaje al cliente en este new_fd para cerrar new_fd} Es decir, el proceso consiste en manejar la conexión enviada por cada cliente una por una, por ejemplo, un cliente envía una conexión, siempre y cuando no haya completado su propia Tarea, entonces siempre ocupará el proceso del servidor hasta que el servidor cierre el socket después del procesamiento. El servidor concurrente es el que se usa con más frecuencia: 1 while (1) 2 {3 new_fd = el servidor acepta la conexión del cliente 4 si (es un proceso secundario) 5 {6 Primero desactive la escucha fd //porque el proceso secundario no necesita escuchar, solo Responsable de procesar los mensajes de concurrencia lógica al cliente 7 Lógica de procesamiento para enviar mensajes 8 Cerrar new_fd 9 Cerrar proceso 10} 11 Cerrar new_fd 12} Por lo tanto, cada vez que un cliente, el servidor clona para procesar la solicitud, el proceso principal siempre está escuchando Y no será bloqueado, quiero hablar sobre el enfoque no está aquí, el enfoque es la línea de código 12! 1. No piense que una bifurcación de subprocesos generará dos nuevos descriptores de socket. De hecho, el proceso hijo y el proceso padre comparten linten_fd y new_fd. Cuando el proceso padre cierra new_fd (línea de código 12), simplemente pone El recuento de acceso new_fd se reduce en uno. Dado que el recuento de acceso también es > 0 (porque todavía hay un nuevo_fd de un cliente adjunto), no se desconecta del cliente. 2. Si no escribimos la línea 12, lo primero, porque el descriptor de socket asignable es limitado, si no se libera después de la asignación, no se puede reciclar, es decir, siempre hay un día en que se agota el descriptor. . En segundo lugar, una vez que la tarea de conexión con el cliente se transfiere al proceso secundario, el proceso primario puede continuar escuchando y aceptando la siguiente conexión, pero si el proceso principal no cierra su conexión con el cliente, significa que la conexión siempre está ahí. Equivalente a cada cliente, este proceso padre tiene incluso un cliente y la conexión es constante, debe conocer las consecuencias.

Copyright © Conocimiento de Windows All Rights Reserved