Repositório contendo o desenvolvimento incremental (P1 → P3) de uma aplicação cliente-servidor para gestão remota de uma lista de carros, desenvolvida na unidade curricular Sistemas Distribuídos (FCUL).
O objetivo do P1 foi implementar a camada base do sistema:
-
Implementação de uma lista ligada de carros (
list.c) usando a biblioteca fornecida (liblist.a). -
Estrutura de dados
data_trepresentando um carro (marca, modelo, ano, preço, combustível). -
Operações da API:
list_addlist_remove_by_modellist_get_by_marcalist_get_by_yearlist_get_model_listlist_order_by_yearlist_size
-
Criação e destruição segura das estruturas (
data_create,data_destroy).
📌 Tudo funcionando localmente, sem comunicação em rede.
No P2 o sistema passou a funcionar em ambiente distribuído.
-
Definição da interface RPC no ficheiro
sdmessage.proto. -
Geração automática de mensagens (
sdmessage.pb-c.*) através de protobuf-c. -
Implementação da camada client_stub (API remota):
- Converte chamadas do cliente em mensagens RPC.
- Envia pedidos ao servidor e recebe respostas.
-
Implementação de um servidor single-thread que:
- Lê mensagens Protobuf.
- Invoca operações sobre a lista.
- Envia respostas codificadas.
-
Implementação de funções de serialização/deserialização com prefixo
uint32_t(protocolo definido no enunciado).
📌 O sistema passa a permitir que um cliente remoto manipule a lista no servidor.
O P3 introduziu concorrência e gestão multi-cliente real.
-
Servidor passou a ser multithreaded utilizando pthread.
-
Suporte para até 5 clientes simultâneos.
- Mais do que isso → servidor responde com
OP_BUSY. - Caso contrário envia
OP_READY.
- Mais do que isso → servidor responde com
-
Implementação de:
- Mutex global para proteção da lista (
pthread_mutex_t). - Mutex para logging.
- Contador de clientes ativos.
- Mutex global para proteção da lista (
-
Servidor.log com registo estruturado:
- Conexões, pedidos, desconexões.
-
network_server.ccompleto:- Função
serve_client()por thread. - Função
network_main_loop()com controlo de capacidade. - Envio inicial de estado (READY/BUSY).
- Função
-
Cliente atualizado para:
- Ler o código inicial READY/BUSY.
- Reagir corretamente (exibir "Server busy. Try again later.").
📌 O sistema cumpre todos os requisitos da fase 3, incluindo robustez, concorrência e sincronização.
/source
client_stub.c
list_client.c
list_server.c
network_client.c
network_server.c
list_skel.c
message-private.c
/include
*.h (interfaces fornecidas + protobuf)
/lib
liblist.a (biblioteca fornecida)
/binary
executáveis gerados (list_client, list_server)
/server.log
Makefile
sdmessage.proto
README.md
./binary/list_server <porto>./binary/list_client 127.0.0.1:<porto>✔ Projetos 1, 2 e 3 completamente funcionais ✔ Servidor multithread estável ✔ Sincronização e controlo de acesso corretos ✔ Testes de stress concluídos (comportamento esperado: 5 clientes OK, restantes BUSY)