Após a identificação dos assinantes N e M através da impressão digital, o servidor central Extra Systems Cypher Net envia simplesmente informação entre eles sem qualquer intervenção neste processo. O servidor não possui chaves privadas nem públicas de assinantes. A negociação das chaves de sessão ocorre assim exclusivamente entre os próprios subscritores, sem qualquer intervenção ou participação do nosso servidor central.
Os pedidos do cliente são processados pelo servidor central em modo multithread utilizando o seguinte algoritmo:
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; }
O conteúdo desta página está também disponível em inglês, francês, alemão, espanhol, ucraniano e russo.
© Extra Systems, 2024 |