O servidor central do sistema Extra Systems Cypher Net é o ponto de encaminhamento do tráfego entre assinantes. Aceita ligações TCP de clientes, recebe deles ficheiros de impressões digitais (identificando assim a legalidade dos subscritores) e, em seguida, garante que estes negoceiam uma chave de sessão através do procedimento prolog. (No caso de um ataque de hacker, se a impressão digital for falsa, a ligação será, naturalmente, imediatamente interrompida.)
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;
}
Como se pode observar no código, imediatamente após iniciar o servidor, através do procedimento load_rsa_keys, este carrega a sua chave privada de um ficheiro local, com o qual irá utilizar o RSA para desencriptar os ficheiros de impressões digitais que chegam dos subscritores (no procedimento check_finger_print). De seguida, é iniciado o procedimento run_main_loop, que escuta na porta e aceita ligações TCP. As chamadas recebidas pelo servidor são colocadas numa fila de serviços - uma matriz estática thread_pool. O atendimento direto das chamadas é realizado pelo procedimento dispatch_call, que é lançado para cada chamada num thread separado (é passada como parâmetro a instância da estrutura thread_data correspondente à ligação fornecida).
O conteúdo desta página está também disponível em inglês, francês, alemão, espanhol, italiano, ucraniano e russo.
| © Extra Systems, 2024 |
|