После идентификации абонентов N и M через 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 dispatch_call(THREADDATA *thread_item) { char str_buf[STR_BUF_SIZE]; int buf_size, my_socket; my_socket = thread_item->thread_socket; if (check_finger_print(thread_item)) { if (connect_server(thread_item)) { if (thread_item->client_mode == CLIENT_MODE_OUTPUT) { while (buf_size = socket_read_buffer(my_socket, str_buf, STR_BUF_SIZE)) { while (thread_pool[thread_item->server_thread].buffer_to_send) es_sleep(100); thread_pool[thread_item->server_thread].buf_size = buf_size; thread_pool[thread_item->server_thread].buffer_to_send = str_buf; } } if (thread_item->client_mode == CLIENT_MODE_INPUT) { while (1) { while (!thread_item->buffer_to_send) es_sleep(100); buf_size = thread_item->buf_size; if (socket_send_buffer(my_socket, thread_item->buffer_to_send, buf_size) != buf_size) break; thread_item->buffer_to_send = NULL; } } } } close_socket(my_socket); thread_item->thread_id = 0; }
© Extra Systems, 2024 |