Skip to content

Chaquillews/SD-24-Projeto

Repository files navigation

🖥️ **SD-24 — Sistemas Distribuídos

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).


📌 Projeto 1 — Estruturas de Dados e API Local

O objetivo do P1 foi implementar a camada base do sistema:

✔️ Componentes desenvolvidos

  • Implementação de uma lista ligada de carros (list.c) usando a biblioteca fornecida (liblist.a).

  • Estrutura de dados data_t representando um carro (marca, modelo, ano, preço, combustível).

  • Operações da API:

    • list_add
    • list_remove_by_model
    • list_get_by_marca
    • list_get_by_year
    • list_get_model_list
    • list_order_by_year
    • list_size
  • Criação e destruição segura das estruturas (data_create, data_destroy).

📌 Tudo funcionando localmente, sem comunicação em rede.


📌 Projeto 2 — RPC Simples com Protocol Buffers (Protobuf-C)

No P2 o sistema passou a funcionar em ambiente distribuído.

✔️ Nesta fase foram desenvolvidos:

  • 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.


📌 Projeto 3 — Concorrência, Multithreading e Controlo de Acesso

O P3 introduziu concorrência e gestão multi-cliente real.

✔️ Funcionalidades principais adicionadas

  • 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.
  • Implementação de:

    • Mutex global para proteção da lista (pthread_mutex_t).
    • Mutex para logging.
    • Contador de clientes ativos.
  • Servidor.log com registo estruturado:

    • Conexões, pedidos, desconexões.
  • network_server.c completo:

    • Função serve_client() por thread.
    • Função network_main_loop() com controlo de capacidade.
    • Envio inicial de estado (READY/BUSY).
  • 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.


📁 Estrutura do Repositório

/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

▶️ Como correr

Servidor:

./binary/list_server <porto>

Cliente:

./binary/list_client 127.0.0.1:<porto>

🎯 Estado atual

✔ 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)


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors