После идентификации абонентов N и M через fingerprint центральный сервер Extra Systems Cypher Net просто пересылает между ними информацию безо всякого вмешательства в этот процесс. Сервер не имеет ни закрытых, ни даже открытых ключей абонентов. Согласование сеансовых ключей, таким образом, происходит исключительно между самими абонентами, без какого бы то ни было вмешательства и участия нашего центрального сервера.
Обработка клиентских запросов производится центральным сервером в многопоточном режиме с помощью такого алгоритма:
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 |
|