Extra Systems

CYPHERNET

Verarbeitung von Anfragen durch einen zentralen Server


Nach der Identifizierung der Teilnehmer N und M per Fingerabdruck sendet der zentrale Extra Systems Cypher Net-Server einfach Informationen zwischen ihnen, ohne in diesen Prozess einzugreifen. Der Server verfügt weder über private noch öffentliche Schlüssel von Abonnenten. Die Aushandlung der Sitzungsschlüssel erfolgt somit ausschließlich zwischen den Teilnehmern selbst, ohne dass unser zentraler Server eingreifen oder beteiligt sein muss.

Clientanfragen werden vom zentralen Server im Multithread-Modus nach folgendem Algorithmus verarbeitet:

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

Der Inhalt dieser Seite ist auch in Englisch, Französisch, Ukrainisch und Russisch verfügbar.


© Extra Systems, 2024 Extra Web Top