Extra Systems

CYPHERNET

traitement des requêtes par un serveur central


Après avoir identifié les abonnés N et M via leur empreinte digitale, le serveur central Extra Systems Cypher Net envoie simplement des informations entre eux sans aucune intervention dans ce processus. Le serveur ne dispose ni de clés privées ni même publiques d'abonnés. La négociation des clés de session s'effectue ainsi exclusivement entre les abonnés eux-mêmes, sans aucune intervention ni participation de notre serveur central.

Les requêtes des clients sont traitées par le serveur central en mode multi-thread selon l'algorithme suivant:

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;
}

Le contenu de cette page est également disponible en anglais, allemand, ukrainien et en russe.


© Extra Systems, 2024 Extra Web Top