El servidor central del sistema Cypher Net de Extra Systems es el punto de reenvío de tráfico entre suscriptores. Acepta conexiones TCP de clientes, recibe archivos de huellas digitales de ellos (identificando así la legalidad de los suscriptores) y luego garantiza que la clave de sesión se acuerde entre ellos a través del procedimiento de prólogo. (En caso de un ataque de piratas informáticos, si la huella digital resulta ser falsa, la conexión, por supuesto, se interrumpe inmediatamente).
typedef struct thread_data { int thread_id; int thread_socket; PEERID client_id; PEERID server_id; int server_thread; char *buffer_to_send; int buf_size; int prolog_size; unsigned char client_mode; } THREADDATA; THREADDATA thread_pool[THREAD_POOL_SIZE]; void run_main_loop(int main_socket) { int new_socket, addr_size, i, pooled; struct sockaddr_in client_addr; while (1) { addr_size = sizeof(client_addr); new_socket = accept(main_socket, (struct sockaddr *) &client_addr, &addr_size); if (new_socket < 0) break; pooled = 0; while (!pooled) { for (i = 0; (i < THREAD_POOL_SIZE) && (!pooled); i++) { if (thread_pool[i].thread_id == 0) { thread_pool[i].thread_socket = new_socket; thread_pool[i].thread_id = esthread_create(dispatch_call, &thread_pool[i]); pooled = 1; } } if (!pooled) es_sleep(100); } } } int main(void) { int my_socket; init_hash(); init_hard_hash(); load_rsa_keys("public_0", "private_0"); sockets_startup(); my_socket = create_server_socket(main_server_port); memset(thread_pool, 0, sizeof(thread_pool)); run_main_loop(my_socket); sockets_cleanup(); return 0; }
Como puede verse en el código, inmediatamente después de iniciar el servidor, mediante el procedimiento load_rsa_keys, carga su clave privada desde un archivo local, con la que utilizará RSA para descifrar los archivos de huellas dactilares que le llegan de los suscriptores (en el procedimiento check_finger_print). Luego se inicia el procedimiento run_main_loop, que escucha en el puerto y acepta conexiones TCP. Las llamadas recibidas por el servidor se colocan en una cola de servicio: una matriz estática thread_pool. El servicio directo de llamadas se realiza mediante el procedimiento dispatch_call, que se inicia para cada llamada en un hilo separado (se le pasa como parámetro la instancia de la estructura thread_data correspondiente a la conexión dada).
El contenido de esta página también está disponible en inglés, francés, alemán, portugués, ucraniano y ruso.
© Extra Systems, 2024 |