- Gustavo Gabriel Ribeiro 13672683
- Artur De Vlieger Lima 13671574
- Gabriel da Costa Merlin 12544420
Este projeto foi desenvolvido como parte do trabalho da disciplina de Redes de Computadores.
A aplicação criada permite a comunicação entre dois ou mais processos distintos, que podem estar em execução na mesma máquina ou em máquinas diferentes conectadas em rede.
Para a comunicação, utilizamos sockets, um dos mecanismos mais comuns para troca de informações em rede.
A conexão entre servidor e clientes foi desenvolvida de forma a utilizar do protocolo da camada de transporte TCP, na qual há uma conexão full-duplex duradoura entre os processos envolvidos.
Empregamos threads para o gerenciamento e troca de mensagens concomitantes entre os clientes.
O projeto é composto por dois arquivos principais:
- server.c: Implementa o lado do servidor da aplicação.
- client.c: Implementa o lado do cliente da aplicação.
- Servidor: Aceita conexões de múltiplos clientes e permite a troca de mensagens entre eles.
- Cliente: Conecta-se ao servidor e permite o envio e recebimento de mensagens.
Para compilar e executar este projeto, você precisará dos seguintes requisitos:
- GCC (GNU Compiler Collection)
- Sistema operacional Unix-like (Linux ou macOS)
Para compilar o projeto, siga os seguintes passos:
- Clone esse repositório:
git clone git@github.com:GustavoZiel/network-communication-server.git- Navegue até os arquivos fonte do projeto:
cd srcExecute os comandos makefile correspondentes:
-
Executando cliente e servidor em uma mesma máquina:
- Em um terminal, inicie o servidor:
make ARGS="<PORT> <TIMEOUT>" runServer- Em outro terminal, inicie o cliente:
make ARGS="<IP_ADDRESS> <PORT>" runClientO servidor deve ser iniciado primeiro para que a conexão dos clientes seja bem sucedida
Pode haver vários terminais clientes se conectando ao mesmo terminal servidor
-
Executando cliente e servidor em máquinas distintas:
- Na máquina que servirá de servidor, execute:
make ARGS="<PORT> <TIMEOUT>" runServer- Nas demais máquinas clientes, execute:
make ARGS="<IP_ADDRESS> <PORT>" runClient
Essa etapa é essencial para o correto funcionamento da aplicação
make ARGS="<PORT> <TIMEOUT>" runServer- É necessário especificar a PORT em que o servidor estará ouvindo.
- É necessário especificar quanto tempo o servidor permanecerá aberto aguardando por conexões.
TIMEOUTé medido em segundos.- Caso
TIMEOUT <= 0, o servidor ficará aguardando por conexões indefinidamente (até que todos os clientes conectados saiam).
make ARGS="8080 10" runServerNesse exemplo, o servidor aguardará por conexões na porta 8080 durante 10 segundos.
make ARGS="<IP_ADDRESS> <PORT>" runClient- É necessário especificar o IP e PORT em que os clientes tentarão se conectar.
- Caso esteja executando o cliente e o servidor na mesma máquina, utilize o comando
ip -f inet addr showpara obter o IP inet da máquina. Atenção: o localhost (127.0.0.1) não é válido.
O IP que os clientes devem usar para se conectarem nessa máquina é, portanto, 192.168.15.6.
make ARGS="192.168.15.6 8080" runClientUm erro ocorre, visto que o servidor não foi iniciado e dessa forma o cliente não consegue se conectar.
Após seguir os passos das seções de compilação e configuração, você terá, em um terminal, o servidor aguardando por conexões, e em outros, clientes se conectando.
- Compreendendo o exemplo:
- O servidor é iniciado e fica escutando na porta 8080 por 10 segundos.
- O cliente tenta se conectar ao IP 192.168.15.6 na porta 8080.
- O servidor aceita a nova conexão e imprime informações sobre o cliente: IP do cliente e porta pela qual o cliente realizou a conexão.
- O cliente é introduzido ao chat e deve informar seu nome.
- Após o servidor receber o nome do cliente, o chat se inicia de fato.
- As mensagens enviadas pelo cliente são visíveis para o servidor e marcadas pelo nome do cliente que as enviou.
- O tempo de espera por novas conexões do servidor se encerra.
- O cliente, ao digitar '/q', sai do chat.
- O servidor recebe a notificação de que o cliente se desconectou.
- Como o servidor não está mais esperando por clientes e todos os clientes se desconectaram, ele se encerra.
- Compreendendo o exemplo:
- O servidor é iniciado e fica escutando na porta 8080 por 10 segundos.
- O cliente 1 tenta se conectar ao IP 192.168.15.6 na porta 8080.
- O servidor aceita a nova conexão e imprime informações sobre o cliente 1: IP do cliente e porta pela qual o cliente realizou a conexão.
- O cliente 1 é introduzido ao chat e deve informar seu nome.
- Após o servidor receber o nome do cliente 1, o chat se inicia de fato.
- O mesmo ocorre para o cliente 2.
- O tempo de espera por novas conexões do servidor se encerra.
- As mensagens enviadas pelo cliente 1 são visíveis para o servidor e marcadas pelo seu nome; elas também são enviadas para o cliente 2.
- Os clientes recebem as mensagens uns dos outros, e o servidor recebe todas as mensagens.
- O cliente 1 se desconecta.
- O servidor notifica todos os outros clientes ativos que o cliente 1 se desconectou.
- O cliente 2 se desconecta.
- Como o servidor não está mais esperando por clientes e todos os clientes se desconectaram, ele se encerra.
Este projeto foi desenvolvido com o intuito de compreender e implementar a comunicação via sockets. Foi possível aprofundar os conhecimentos em redes, reforçar a técnica de multithreading utilizando artifícios de Sistemas Operacionais, como semáforos, e aprimorar as habilidades de programação em C.
O desenvolvimento do projeto proporcionou uma experiência prática valiosa e consolidou conceitos teóricos importantes.




