Le serveur central du système Extra Systems Cypher Net est le point de transfert du trafic entre les abonnés. Il accepte les connexions TCP des clients, reçoit de leur part des fichiers d'empreintes digitales (fingerprint, identifiant ainsi la légalité des abonnés), puis garantit que la clé de session est convenue entre eux via la procédure de prologue. (En cas d'attaque de pirate informatique, si l'empreinte digitale s'avère fausse, la connexion est bien entendu immédiatement interrompue.)
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; }
Comme le montre le code, immédiatement après le démarrage, le serveur, via la procédure load_rsa_keys, charge sa clé privée à partir d'un fichier local, avec lequel il utilisera RSA pour décrypter les fichiers d'empreintes digitales provenant des abonnés (dans la procédure check_finger_print). Ensuite, la procédure run_main_loop est lancée, qui écoute sur le port et accepte les connexions TCP. Les appels reçus par le serveur sont placés dans une file d'attente pour la maintenance - un tableau statique thread_pool. Le service direct des appels est effectué par la procédure dispatch_call, qui est lancée pour chaque appel dans un thread distinct (l'instance de la structure thread_data correspondant à la connexion donnée lui est transmise en paramètre).
Le contenu de cette page est également disponible en anglais, allemand, ukrainien et en russe.
© Extra Systems, 2024 |