Il server centrale del sistema Extra Systems Cypher Net è il punto di inoltro del traffico tra gli abbonati. Accetta connessioni TCP dai client, riceve da loro file di impronte digitali (identificando così la legalità degli abbonati) e quindi garantisce che negozino una chiave di sessione attraverso la procedura prolog. (In caso di attacco hacker, se l'impronta digitale risulta falsa, la connessione, ovviamente, viene immediatamente interrotta.)
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; }
Come si può vedere dal codice, subito dopo l'avvio il server, attraverso la procedura load_rsa_keys, carica la propria chiave privata da un file locale, con il quale utilizzerà RSA per decriptare i file di impronte digitali che gli arrivano dagli abbonati (nella procedura check_finger_print). Successivamente viene avviata la procedura run_main_loop, che resta in ascolto sulla porta e accetta connessioni TCP. Le chiamate ricevute dal server vengono inserite in una coda per la manutenzione: un array statico thread_pool. Il servizio diretto delle chiamate viene effettuato dalla procedura dispatch_call, che viene avviata per ogni chiamata in un thread separato (viene passata come parametro l'istanza della struttura thread_data corrispondente alla connessione specificata).
Il contenuto di questa pagina è disponibile anche in inglese, francese, tedesco, portoghese, spagnolo, ucraino e russo.
© Extra Systems, 2024 |
|