Você está na página 1de 2

Avaliação Técnica – Linguagem C++

Desenvolvimento de um Chat de Comunicação

Pré-requisitos

Para o desenvolvimento de um projeto de chat, o candidato deverá instalar e configurar as seguintes


ferramentas e bibliotecas em ambiente Windows (7,8 ou 10):

 IDE Qt Creator 5.6.0 for Windows 32 bits (MinGW 4.9.2), que pode ser baixado através do
link: http://download.qt.io/official_releases/qt/5.6/5.6.0/qt-opensource-windows-x86-mingw492-
5.6.0.exe.

 Biblioteca Boost 1.60.0, que pode ser baixado através do link:


https://sourceforge.net/projects/boost/files/boost/1.60.0/.

Configuração

A IDE Qt Creator será utilizada como ambiente de desenvolvimento para a linguagem C++. A versão
supracitada já possui o compilador MinGW (versão minimalista do GCC para Windows) integrada.
Já a biblioteca Boost será utilizada com o intuito de abstrair a utilização de métodos e funções que
utilizam a API do sistema operacional (por exemplo, sockets de conexão, threads, seções críticas,
etc.).
Para a instalação e configuração da IDE Qt Creator, o candidato poderá se basear na documentação
online da ferramenta no site: http://www.qt.io/ide/.
Para a configuração e integração da biblioteca Boost à IDE Qt Creator, o candidato poderá se basear
na documentação online da biblioteca no site: http://www.boost.org/.
Ademais, qualquer fórum de internet pode ser utilizado como referência de ajuda para a realização
das configurações.

Projeto

O candidato deverá desenvolver um aplicativo servidor e um aplicativo cliente com a finalidade de


simular um sistema de chat utilizando o modelo cliente-servidor.
Sob esta perspectiva um aplicativo servidor poderá receber conexão de vários aplicativos clientes
bem como poderá desconectar qualquer aplicativo cliente de seu pool de conexões quando bem
entender. Além disso, quando um aplicativo cliente realizar conexão, ou desconexão, o aplicativo
servidor deverá salvar, em arquivo, tais eventos.
Cada cliente será identificado pelo nickname, portanto, quando um aplicativo cliente realizar a
conexão junto ao aplicativo servidor, ele deverá enviar um nickname após a conexão. Caso o
nickname já esteja sendo utilizado, o servidor deverá notificar o aplicativo cliente e, em seguida,
desconectá-lo. Do contrário, o servidor deverá enviar um broadcast para os demais clientes
conectados avisando que um novo cliente está conectado e enviar uma lista de clientes conectados
para o cliente que acabou de realizar conexão. Vale ressaltar que um aplicativo cliente não pode
receber notificação de que ele mesmo se conectou ao servidor.
De forma análoga, sempre que um cliente se desconectar do servidor, este deverá enviar um
broadcast para os demais clientes conectados avisando que o referido cliente saiu da lista de clientes
conectados.
Uma vez que esteja conectado, o cliente poderá escolher, a partir da lista de clientes conectados,
para qual nickname gostaria de enviar uma mensagem. A forma como isso estará visível no
aplicativo cliente ficará sob o critério do candidato, podendo ser feito como achar melhor.
Especificações Técnicas

Abaixo seguem as especificações que o candidato deverá considerar para o desenvolvimento dos
aplicativos servidor e cliente. Ao ser mencionada a criação de classes, entenda que será necessário
instanciá-las como objetos em tempo de execução. Ademais, o formato das mensagens utilizadas
para comunicação entre os clientes que estarão conectados ao servidor, ficará a critério do
candidato.

Aplicativo Cliente:

Para a realização de conexão junto ao aplicativo servidor, o aplicativo cliente deverá criar uma classe
que represente a conexão. Esta classe será responsável por alocar e desalocar um socket nos
eventos de conexão e desconexão, respectivamente, bem como escutar as respostas vindas do
servidor em um novo fluxo paralelo. Sempre que houver um evento de conexão e desconexão, o
cliente deverá emitir um aviso ao usuário do aplicativo cliente, utilizando a classe de conexão, que
poderá ser desenvolvida a critério do candidato. Antes de enviar uma mensagem, o cliente deve se
certificar de que o socket esteja realmente conectado e caso contrário emitir um alerta ao usuário do
aplicativo.

Aplicativo Servidor:

Para o gerenciamento de conexões vindas dos aplicativos clientes, o aplicativo servidor deverá criar
uma classe para representar o gerenciamento de conexões. Para isso a referida classe deverá
escutar novas requisições de conexão vinda dos clientes em um novo fluxo paralelo.
Uma vez que uma requisição de conexão seja recebida e seu nickname seja autenticado, uma nova
task de socket deverá ser criada, alocada dinamicamente em memória e armazenada na classe de
gerenciamento de conexões através do uso de dicionário de dados onde o identificador da conexão
será o nickname enviado pelo cliente. Além disso, a classe gerenciadora de conexões deverá
notificar as demais tasks acerca da nova task criada e autenticada.
A comunicação entre cada task de socket e o gerenciador de conexões deverá acontecer sob o
modelo Publish/Subscribe, no qual cada task irá ler a mensagem chegada ao socket e inserí-la em
uma fila única protegida (Publish). O serviço do gerenciador de conexões, por sua vez, deverá
consumir as mensagens postadas na fila e despachar aos respectivos destinos (Subscribe).
Por fim deverá ser criada uma classe responsável por gravar em disco as informações de conexão,
desconexão e envios de mensagens ocorridos no servidor. Esta classe, doravante chamada de
classe de log, deverá possuir uma fila de acesso protegido e rodar em mais um novo fluxo paralelo
que ficará responsável por consumir as mensagens da fila e persisti-las em disco. Portanto, sempre
que um evento de conexão, desconexão e envios de mensagens ocorrer no servidor, a classe de log
deverá ser acionada.
Lembre-se que uma fila de acesso protegido não pode ser acessada (seja para produção ou
consumação) por mais de um recurso simultaneamente. Portanto um mecanismo de exclusão mútua
deverá ser utilizado.

Você também pode gostar