Extra Systems

CYPHERNET

elaborazione delle richieste da parte di un server centrale


Dopo aver identificato gli abbonati N e M tramite impronta digitale, il server centrale Extra Systems Cypher Net invia semplicemente informazioni tra loro senza alcun intervento in questo processo. Il server non ha né chiavi private né pubbliche degli abbonati. La negoziazione delle chiavi di sessione avviene quindi esclusivamente tra gli stessi abbonati, senza alcun intervento o partecipazione del nostro server centrale.

Le richieste del client vengono elaborate dal server centrale in modalità multi-thread utilizzando il seguente 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;
}

Il contenuto di questa pagina è disponibile anche in inglese, francese, tedesco, portoghese, spagnolo, ucraino e russo.


© Extra Systems, 2024 Extra Web Top