LEIC/LERC 2010/11

Sistemas Operativos

Aula 7

Comunicação entre Processos via Sockets

 

Objectivo



Introdução

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

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

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

Material de Apoio

 


Exercício

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:

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

2. Início da implementação da API SNFS

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.

 


Exercício Suplementar

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.