Центральний сервер системи Extra Systems Cypher Net є точкою пересилання трафіку між абонентами. Він приймає TCP-з'єднання від клієнтів, отримує від них файли fingerprint (ідентифікуючи цим легальність абонентів), після чого забезпечує узгодження між ними сеансового ключа за допомогою процедури прологу. (У разі хакерської атаки, якщо fingerprint виявився фальшивим, зв'язок, зрозуміло, відразу обривається.)
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; }
Як видно з коду, відразу після запуску сервер через процедуру load_rsa_keys завантажує з локального файлу свій закритий ключ, яким він через RSA розшифровуватиме файли fingerprint, що надходять від абонентів (у процедурі check_finger_print). Потім запускається процедура run_main_loop, яка слухає порт і приймає з'єднання TCP. Прийняті сервером дзвінки поміщаються у чергу обслуговування - статичний масив thread_pool. Безпосереднє обслуговування викликів здійснюється процедурою dispatch_call, яка запускається для кожного виклику в окремому потоці (як параметр їй передається відповідний даному з'єднанню екземпляр структури thread_data).
Контент цієї сторінки доступний також англійською, французькою, німецькою та російською мовами.
© Extra Systems, 2024 |