Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/natan-dot-com/internet-relay-chat
Simple internet relay chat implementation made with learning purposes
https://github.com/natan-dot-com/internet-relay-chat
chat icmc irc networks protocol usp
Last synced: 1 day ago
JSON representation
Simple internet relay chat implementation made with learning purposes
- Host: GitHub
- URL: https://github.com/natan-dot-com/internet-relay-chat
- Owner: natan-dot-com
- License: mit
- Created: 2022-06-08T00:56:26.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2022-07-22T03:25:34.000Z (over 2 years ago)
- Last Synced: 2023-03-08T12:38:46.120Z (over 1 year ago)
- Topics: chat, icmc, irc, networks, protocol, usp
- Language: C++
- Homepage:
- Size: 79.1 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Redes de Computadores - Internet Relay Chat
> Este trabalho pode ser acessado pelo [Github](https://github.com/natan-dot-com/Internet-Relay-Chat), [vídeo](https://youtu.be/FRpHRayL3GY).
### Autores
- Natan Henrique Sanches (11795680)
- Gabriel da Cunha Dertoni (11795717)
- Álvaro José Lopes (10873365)## Introdução
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).
## Implementação
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.
## Procedimentos de Execução
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.
```bash
# Compila tanto o servidor, quanto o cliente.
make# Roda o sevidor
./build/server/main# Roda o client
./build/client/main 8080
# ^^^^~~~ porta para se conectar.
```## Comandos
Neste projeto, foram implementados os comandos do protocolo [RFC 1459](https://datatracker.ietf.org/doc/html/rfc1459). Os comandos requisitados no enunciado foram, portanto, codificados em função dos comandos do RFC 1459.
#### Lista de Comandos
|**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 `|Entra (ou cria, se não existir) no canal ``|Todos os usuários|
|`/nickname `|Atribui um determinado apelido para o cliente autor|Todos os usuários|
|`/user `|Atribui informações a um cliente com determinado apelido|Todos os usuários|
|`/kick `|Expulsa um determinado usuário do servidor|Somente administrador|
|`/mute `|Proíbe um determinado usuário de mandar mensagens|Somente administrador|
|`/unmute `|Restaura a permissão de um determinado usuário de mandar mensagens|Somente administrador|
|`/whois `|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.