- Introdução
- Execução do programa
- Bibliotecas Utilizadas
- Funções Utilizadas
- Estrutura do Código
- Conclusão e Considerações Finais
- Referencias
O programa cliente-servidor com memória compartilhada é uma aplicação que permite a troca de mensagens e o compartilhamento de arquivos entre servidor e vários clientes. A utilização de memória compartilhado nesse caso é uma técnica eficiente para a comunicação entre processos, pois permite acesso direto à memória, sem a necessidade de comunicação por meio de sockets ou outros mecanismos IPC (Inter-Process Communication) .Neste relatório, analisaremos a execução do programa, as bibliotecas utilizadas e a estruturação do código.
Para executar o programa siga os passos abaixo:
-
Compilação: Utilize um compilador C para compilar os arquivos "client.c" e "server.c" em binários executáveis. Por exemplo: 1.
gcc server.c funcoes.o -o server gcc client.c funcoes.o -o client
-
Execução do Servidor: Inicie o programa servidor executando o binário do servidor. Isso abrirá um terminal que ficará aguardando a conexão dos clientes. Por exemplo:
./server
-
Execução dos Clientes: Em diferentes instâncias do terminal, execute o programa cliente executando o binário do cliente. Isso permitirá a comunicação entre os clientes e o servidor. Por exemplo:
./client
-
Interagindo com o Programa: Ao executar o cliente, você será apresentado a um menu com opções para enviar mensagens, visualizar mensagens, enviar arquivos, visualizar arquivos e sair. Selecione a opção desejada digitando o número correspondente e siga as instruções adicionais.
-
Encerramento do Programa: Para encerrar o programa cliente ou servidor, selecione a opção "Sair" no menu.
É importante ressaltar que o programa cliente-servidor com memória compartilhada deve ser executado em um ambiente adequado, com as permissões necessárias e as bibliotecas requeridas. Caso contrário, erros podem ocorrer durante a execução.
O programa faz uso de algumas bibliotecas importantes. A seguir, descreveremos as principais bibliotecas utilizadas e sua função no contexto do programa:
stdio.h
: Essa biblioteca é amplamente utilizada em programas C e fornece funções para entrada e saída de dados. No código, ela é usada para realizar a leitura e escrita de dados pelo usuário no cliente e para exibir mensagens e informações no servidor.stdlib.h
: Essa biblioteca padrão em C fornece funções para alocação de memória, conversão de tipos, geração de números aleatórios e outras operações gerais. No código, é usada para realizar a alocação de memória compartilhada, manipulação de ponteiros e finalização do programa.string.h
: Essa biblioteca oferece várias funções para manipulação de strings em C. No programa cliente, é utilizada para manipular as mensagens digitadas pelo usuário, como copiar, comparar e remover caracteres indesejados. Também é utilizada no servidor para manipular os dados recebidos dos clientes.sys/ipc.h
esys/shm.h
: Essas bibliotecas são específicas para o uso de memória compartilhada em sistemas Unix. Elas fornecem as estruturas e funções necessárias para a criação, obtenção e manipulação de segmentos de memória compartilhada. No código, são usadas para criar e acessar a memória compartilhada entre o cliente e o servidor.unistd.h
: Essa biblioteca padrão em C fornece acesso a várias constantes, tipos e funções relacionadas ao sistema operacional. No código, é utilizada para obter o ID do processo, permitindo a identificação única de cada cliente.stdbool.h
: Essa biblioteca define o tipo de dadosbool
em C, juntamente com os valorestrue
efalse
. No código, é usada para realizar verificações lógicas e controlar a execução do programa com base em condições.
Cada biblioteca desempenha um papel importante para o correto funcionamento do programa, fornecendo funções e estruturas necessárias para realizar tarefas específicas.
generateKey() // Retorna uma key com variavies padrões do projeto
ftok() // Retorna uma chave unica para o arquivo
shmget() // Retorna o id do segmento de memoria compartilhada
shmat() // Usada para associar o segmento de memoria compartilhada ao processo
shmdt() // Desassocia o segmento de memoria compartilhada do processo
shmctl() // Remove o segmento de memoria compartilhada
getpid() // Retorna o id do processo atual
fgets() // Le uma string do teclado
strcpy() // Copia uma string para outra
memset() // Preenche um bloco de memoria com um valor especifico
fopen() // Abre um arquivo
fseek() // posiciona o ponteiro do arquivo
ftell() // retorna o tamanho do arquivo
O programa é dividido em duas partes principais: o cliente e o servidor. Ambos os códigos estão contidos em arquivos separados para facilitar a compreensão e manutenção do código.
A estrutura de dados Message
é definida no código tanto do cliente quanto do servidor. Essa estrutura contém campos para o ID do cliente, a mensagem, o nome e o conteúdo do arquivo, bem como o tamanho do arquivo. Essa estrutura é utilizada para armazenar e transmitir os dados entre o cliente e o servidor por meio da memória compartilhada.
O código é estruturado de forma a permitir a comunicação bidirecional entre o cliente e o servidor, com o uso da memória compartilhada como meio de troca de informações. O servidor aguarda a chegada de mensagens ou arquivos dos clientes e os exibe no terminal. O cliente permite que o usuário digite mensagens, envie arquivos e visualize as mensagens recebidas do servidor.
O programa apresentado é uma aplicação prática e eficiente para a troca de mensagens e compartilhamento de arquivos entre processos. A utilização de memória compartilhada proporciona uma forma rápida e direta de comunicação, evitando a necessidade de comunicação por meio de sockets ou outros mecanismos mais complexos.
No presente relatório, abordamos a execução do programa, destacando as etapas para compilação, execução e interação com o programa. Além disso, foram apresentadas as principais bibliotecas utilizadas, ressaltando seu papel no contexto do programa.
Também discutimos a estruturação do código, dividido em partes distintas para o cliente e o servidor. Ambos os códigos utilizam a estrutura de dados Message
para armazenar e transmitir os dados pela memória compartilhada.
Em resumo, o programa demonstra o uso prático da comunicação entre processos por meio de memória compartilhada, oferecendo uma solução eficiente e de baixa complexidade para a troca de mensagens e compartilhamento de arquivos.
- Biblioteca
stdio.h
- Link para a documentação - Biblioteca
stdlib.h
- Link para a documentação - Biblioteca
string.h
- Link para a documentação - Biblioteca
sys/ipc.h
- Link para a documentação - Biblioteca
sys/shm.h
- Link para a documentação - Biblioteca
unistd.h
- Link para a documentação - Biblioteca
stdbool.h
- Link para a documentação ftok
- Link para a documentaçãofopen
- Link para a documentação- https://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c
- Inter process communication shared_memory
- How to create a shared memory segment