Extra Systems

CYPHERNET

processamento de pedidos por um servidor central


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 Extra Web Top