1. Utilização de sockets com ligação - stream
Copie o ficheiro aula6-stream.zip para a sua área de trabalho e descomprima o seu conteúdo:
unzip aula6-sockstream.zipa) Estude o código fonte e identifique a sequência de passos de acordo com o esquema.
b) Compile e execute o servidor. Localize o nome do socket ("./server.socket") no sistema de ficheiros com o comando
ls
.c) Compile e execute o cliente. Compreenda o resultado.
2. Utilização de sockets sem ligação - datagram
Copie o ficheiro aula6-dgram.zip para a sua área de trabalho e descomprima o seu conteúdo:
unzip aula6-sockdgram.zipa) Estude o código fonte e identifique a sequência de passos descritos no esquema.
b) Compile e execute o servidor. Localize o nome do socket do servidor.
c) Compile e execute o cliente. Compreenda o resultado. Verifique que o cliente também associa um nome ao seu socket.
Implementação da API SNFS
Um dos objectivos do projecto é implementar a API do sistema de ficheiros distribuído SNFS (ver figura seguinte).
O mecanismo de comunicação cliente-servidor SNFS utiliza sockets Unix sem ligação (datagram). Os componentes envolvidos na comunicação são: snfs_api.c, snfs.c e server.c, e as interfaces snfs_api.h, snfs_proto.h e snfs.h. O servidor implementa os serviços SNFS (snfs.c) com as restrições indicadas no enunciado do projecto (ver págs 6 e 7). Falta, no entanto, completar o esqueleto da API SNFS (snfs_api.c) que permitirá aos clientes invocar os serviços do servidor transparentemente (snfs_api.h deverá conter a assinatura de todas as funções da API). A interface snfs_proto.h é comum a clientes/servidor e descreve o formato das mensagens trocadas.
Neste exercício, pretende-se implementar a componente cliente snfs_api.c. Por esse motivo, as aplicações cliente de teste seguintes usarão directamente a interface snfs_api.h e não myfs.h como indicado na figura.
1. Primeiros passos
a) Copie o pacote snfs+sthreads-skel.tar.gz, descomprima-o e instale-o na sua área de trabalho. Identifique os componentes da arquitectura.
b) Substituir a linha nº 50 do ficheiro snfs.c do directório snfs_server pela seguinte:
*ressz = sizeof(*res) - sizeof(res->body) + sizeof(res->body.ping.msg);
c) Considere o código do servidor SNFS (directório snfs_server). Observe:
- Ciclo principal do servidor (server.c)
- Implementação dos serviços actualmente fornecidos: LOOKUP, READ, WRITE, CREATE, MKDIR, READDIR e PING no módulo (snfs.c).
- Formato das mensagens de pedido/resposta desses serviços no módulo (snfs_proto.c).
d) Compile o servidor (make) e corra o executável (server). Verifique que o servidor criou um socket.
e) Copie e descomprima o pacote test-api-snfs.tgz para o directório snfs+sthreads (abra outro terminal). O directório test-api-snfs tem exemplos de aplicações (cliente) de teste que usam directamente a biblioteca API SNFS (snfs_api.h e snfs_api.c).
f) Considere o exemplo test-ping.c. Observe o código, compile (
make test-ping
), execute e verifique que este teste invoca o serviço PING no servidor.g) Como é que as mensagens do serviço PING são enviadas/recebidas para/do socket (ver snfs_api.c)?
h) Altere o código no servidor para que este responda a um pedido PING com a string
"PONG to client!"
.
Nota: para associar um endereço único ao socket do cliente na inicialização
da camada
SNFS API, pode utilizar a função mkstemp
que gera um nome único no sistema de ficheiros
(man mkstemp). Pode assumir que o endereço do socket do servidor é definido
pela macro SERVER_SOCK em tempo de compilação e, por omissão, toma o valor "/tmp/server.socket".
Implemente agora as funções da API SNFS que invocam os serviços SNFS relevantes. Esta tarefa corresponde à Parte II - Protocolo SNFS, ponto 2 (consultar o enunciado do projecto na página 15).
Para cumprir este objectivo apenas necessita alterar o ficheiro snfs_api.c.
Use como protótipo as várias funções já implementadas ( snfs_ping
, snfs_lookup
, snfs_read
, snfs_write
, etc...) no módulo snfs_api.c. Consulte
a implementação dos serviços no servidor para compreender melhor como deve formatar
as mensagens. Utilize os testes que se encontram no directório test-api-snfs.
O
enunciado do
projecto descreve cada um dos serviços SNFS que já se encontram implementatados e cada um dos serviços a implementar.
Os serviços SNFS a implementar são os seguintes:
-
snfs_remove
para apagar um ficheiro ou um directório vazio (test-remove.c). Nota: o directório root ('/') não pode ser apagado.
-
snfs_copy
para copiar ficheiros (test-copy.c).-
snfs_append
para a concatenação do conteúdo de dois ficheiros (test-append.c).-
snfs_diskusage
dump (no terminal do servidor) dos blocos ocupados do sistema de ficheiros (test-diskusage.c).-
snfs_defrag
para a desfragmentação do sistema de ficheiros (test-defrag.c).-
snfs_dumpcache
dump (no terminal do servidor) do conteúdo da cache de blocos (test-dumpcache.c).
Nota: O servidor deve ser reinicializado antes da execução de cada teste.
Select
Implemente um servidor com a funcionalidade observada nos pontos 1 e 2 da Introdução. Este servidor deve ter a possibilidade de interagir com clientes do tipo stream e datagram.
Será necessário investigar o funcionamento da chamada sistema select e
utilizar as primitivas respectivas: select
, FD_SET
, FD_CLR
, FD_ISSET
e FD_ZERO
. Recomenda-se a consulta do exemplo aula6-select.zip.