Extra Systems

CYPHERNET

zentraler Server


Der zentrale Server des Extra Systems Cypher Net-Systems ist der Punkt für die Weiterleitung des Datenverkehrs zwischen Teilnehmern. Es akzeptiert TCP-Verbindungen von Clients, empfängt Fingerabdruckdateien von ihnen (und identifiziert so die Legalität der Abonnenten) und stellt dann sicher, dass der Sitzungsschlüssel im Rahmen des Prolog-Verfahrens zwischen ihnen vereinbart wird. (Sollte sich im Falle eines Hackerangriffs herausstellen, dass der Fingerabdruck gefälscht ist, wird die Verbindung natürlich sofort unterbrochen.)

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 run_main_loop(int main_socket) {
	int new_socket, addr_size, i, pooled;
	struct sockaddr_in client_addr;
	while (1)
	{
		addr_size = sizeof(client_addr);
		new_socket = accept(main_socket, (struct sockaddr *) &client_addr, &addr_size);
		if (new_socket < 0) break;
		pooled = 0;
		while (!pooled) {
			for (i = 0; (i < THREAD_POOL_SIZE) && (!pooled); i++) {
				if (thread_pool[i].thread_id == 0) {
					thread_pool[i].thread_socket = new_socket;
					thread_pool[i].thread_id = esthread_create(dispatch_call, &thread_pool[i]);
					pooled = 1;
				}
			}
			if (!pooled) es_sleep(100);
		}
	}
}

int main(void)
{
	int my_socket;
	init_hash();
	init_hard_hash();
	load_rsa_keys("public_0", "private_0");
	sockets_startup();
	my_socket = create_server_socket(main_server_port);
	memset(thread_pool, 0, sizeof(thread_pool));
	run_main_loop(my_socket);
	sockets_cleanup();
	return 0;
}

Wie aus dem Code ersichtlich ist, lädt der Server unmittelbar nach dem Start über die Prozedur „load_rsa_keys“ seinen privaten Schlüssel aus einer lokalen Datei, mit dem er RSA verwendet, um Fingerabdruckdateien zu entschlüsseln, die von Abonnenten zu ihm kommen (in der Prozedur „check_finger_print“). Anschließend wird die Prozedur run_main_loop gestartet, die den Port abhört und TCP-Verbindungen akzeptiert. Vom Server empfangene Anrufe werden zur Bearbeitung in eine Warteschlange gestellt – ein statisches Array thread_pool. Die direkte Bearbeitung von Aufrufen erfolgt durch die Prozedur „dispatch_call“, die für jeden Aufruf in einem separaten Thread gestartet wird (die dieser Verbindung entsprechende Instanz der thread_data-Struktur wird ihr als Parameter übergeben).

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


© Extra Systems, 2024 Extra Web Top