- Natan Henrique Sanches (11795680)
- Gabriel da Cunha Dertoni (11795717)
- Álvaro José Lopes (10873365)
Neste projeto, foi implementado um modelo de IRC (Internet Relay Chat) simples, baseado na interação entre diversos clientes e um servidor. O projeto foi feito com caráter pedagógico para a disciplina de Redes de Computadores, utilizando linguagem C++ e bibliotecas como sys/socket.h
, arpa/inet.h
e netinet/in.h
(para permitir a transmissão de mensagens cliente-servidor), além da biblioteca ncurses.h
(para criação da interface do cliente).
O servidor pôde ser implementado em uma única thread, através da utilização do sistema de gerenciamento de eventos em um descritor de arquivos (poll
). Além disso, o cliente foi implementado com duas threads, encarregadas de enviar mensagens (sender) e receber mensagens (receiver) do servidor. A thread sender envia mensagens por demanda ao servidor central, enquanto a thread receiver constantemente lê o buffer de mensagens e, se houver alguma ainda não entregue, ela é exibida na tela.
O projeto foi testado nos sistemas operacionais Debian 11 'Bullseye' e Windows 11, além de ter sido compilado (em ambos os casos) com G++11.
# Compila tanto o servidor, quanto o cliente.
make
# Roda o sevidor
./build/server/main
# Roda o client
./build/client/main <ip_do_servidor> 8080
# ^^^^~~~ porta para se conectar.
Neste projeto, foram implementados os comandos do protocolo RFC 1459. Os comandos requisitados no enunciado foram, portanto, codificados em função dos comandos do RFC 1459.
Comando | Descrição | Permissão |
---|---|---|
/connect |
Estabelece a conexão com o servidor | Todos os usuários |
/quit |
Encerra a conexão do cliente com o servidor | Todos os usuários |
/ping |
Checa o estado da conexão com o servidor. Retorna pong se estiver conectado |
Todos os usuários |
/join <Nome Canal> |
Entra (ou cria, se não existir) no canal <NomeCanal> |
Todos os usuários |
/nickname <Apelido> |
Atribui um determinado apelido para o cliente autor | Todos os usuários |
/user <Apelido> <Nome Real> |
Atribui informações a um cliente com determinado apelido | Todos os usuários |
/kick <Apelido> |
Expulsa um determinado usuário do servidor | Somente administrador |
/mute <Apelido> |
Proíbe um determinado usuário de mandar mensagens | Somente administrador |
/unmute <Apelido> |
Restaura a permissão de um determinado usuário de mandar mensagens | Somente administrador |
/whois <Apelido> |
Visualiza informações (incluindo o IP) de determinado usuário | Somente administrador |
Em nossa implementação, o comando connect
é executado automaticamente por parte do cliente. Além disso, o comando nickname
é mandatório e deve ser o primeiro utilizado após estabelecimento da conexão. Seguido dele, deve ser utilizado o comando user
para dar informações sobre o cliente que está se conectando. Após isso, o usuário terá acesso ao restante dos comandos.