20
Rede de Computadores
UFMG
16
Rede de Computadores
UFMG
1
Rede de Computadores
UFMG
25
Rede de Computadores
UFMG
25
Rede de Computadores
UFMG
43
Rede de Computadores
UFMG
16
Rede de Computadores
UFMG
20
Rede de Computadores
UFMG
16
Rede de Computadores
UFMG
26
Rede de Computadores
UFMG
Texto de pré-visualização
Trabalho prático 2 Aviãozinho Entrega individual Data de Entrega 22 de junho de 2025 às 2359 1 Introdução O Aviator popularmente chamado de jogo do aviãozinho é um jogo de cassino online em que um avião decola e o multiplicador de apostas 𝑚 sobe continuamente 100 101 102 até explodir Cada jogador aposta um valor antes da decolagem e pode solicitar cashout a qualquer momento durante o voo o pagamento é aposta 𝑚 do instante do pedido Se o avião explode antes do cashout o jogador perde a aposta 2 Objetivos Utilizar apenas as funcionalidades da biblioteca de sockets POSIX na linguagem C e a comunicação via protocolo TCP Implementar um servidor multithread capaz de aceitar e gerenciar múltiplas conexões simultâneas até 10 jogadores Implementar um cliente que se conecte ao servidor envie apostas efetue cashout e receba atualizações em tempo real Exibir logs padronizados no servidor e nos clientes Garantir compatibilidade com IPv4 e IPv6 3 Protocolo de comunicação Todas as mensagens são trocadas pelo socket TCP entre servidor e clientes utilizando a seguinte estrutura define STRLEN 11 struct aviatormsg int32t playerid float value char typeSTRLEN float playerprofit float houseprofit Significado dos campos playerid Um valor 1 atribuído pelo servidor único por conexão utilizado em todas as mensagens seguintes para identificar o jogador value Campo numérico em ponto flutuante float exibido sempre com duas casas decimais O significado específico depende do type e está detalhado na tabela abaixo Quando especificado como o campo não é utilizado e pode ser preenchido com zero ou qualquer valor padrão playerprofit Profit acumulado do jogador Indica o saldo de ganhos ou perdas do jogador durante a sessão houseprofit Profit acumulado do servidor casa Representa o saldo total de ganhos ou perdas do servidor em relação a todos os jogadores conectados na sessão type Origem value Descrição start Servidor Cliente Cronômetro de 10 segundos Marca o começo da rodada e realiza contagem regressiva closed Servidor Cliente Janela de apostas encerrada bet Cliente Servidor Valor da aposta Enviado antes da rodada começar só uma aposta por rodada cashout Cliente Servidor Pedido de saque O servidor calcula o multiplicador atual e responde multiplier Servidor Cliente Multiplicador atual Broadcast a cada 100 ms durante o voo explode Servidor Cliente Multiplicador final Indica explosão do avião apostas ainda não sacadas são perdidas payout Servidor Cliente Valor pago Pagamento ao cliente após um saque bem sucedido profit Servidor Cliente Profit acumulado Enviado após cashoutexplode para informar profit atualizado bye Bidirecional CS ou SC Encerramento da conexão 4 Inicialização dos programas Servidor server v4v6 port O servidor exige dois argumentos protocol v4 IPv4 v6 IPv6 port A porta na qual o servidor está ouvindo Exemplo server v4 51511 Cliente client serverip port nick apelido O cliente exige três argumentos serverip O IP ou hostname do servidor por exemplo 127001 se estiver na mesma máquina port A porta na qual o servidor está ouvindo deve ser igual à usada no servidor apelido Identificação do jogador Exemplo client 127001 51511 nick Flip Lista de erros obrigatórios a serem tratados no cliente em ordem de prioridade Descrição do erro Exemplo de comando Mensagem Número de argumentos incorreto client 127001 51511 nick Flip bet 10 Error Invalid number of arguments Flag nick ausente client 127001 51511 Flip Error Expected nick argument Apelido muito longo 13 client 127001 51511 nick FlipFlopFlaFlu Error Nickname too long max 13 Valor de aposta inválido 10 ou 0 Error Invalid bet value Caractere inválido Diferente de C Diferente de Q Error Invalid command OBS Não é necessário tratar erros fora da lista 5 Cálculo do ponto de explosão A explosão do avião ocorre em um ponto calculado dinamicamente a cada rodada com base no número de jogadores ativos e no total apostado O objetivo é garantir uma variação natural de multiplicadores entre rodadas ao mesmo tempo em que se preserva a vantagem da casa O ponto de explosão é definido pelo multiplicador máximo da rodada denotado por Este valor é calculado pelo servidor segundo a seguinte fórmula Onde é o número de jogadores que apostaram na rodada é o valor total apostado na rodada calculado como o somatório das apostas individuais de todos os jogadores com sendo o valor apostado pelo jogador é o expoente de suavização que define o crescimento do multiplicador de explosão Por padrão neste trabalho será utilizado ou seja aplicaremos a raiz quadrada da expressão interna A constante é utilizada para normalizar o valor monetário das apostas de modo que seu peso na fórmula seja proporcional ao número de jogadores Substituindo a fórmula final da explosão tornase Este será o limite máximo do multiplicador O avião explode assim que o valor atual do multiplicador enviado pelo servidor atinge ou ultrapassa Após a explosão todas as apostas que não realizaram cashout são consideradas perdidas Exemplo Se houver 4 jogadores e as apostas forem R10 R25 R15 e R50 O avião irá explodir quando o multiplicador atingir aproximadamente 245x O gráfico acima ilustra o crescimento linear do multiplicador ao longo do tempo A linha vermelha tracejada marca o exato momento em que o avião explode encerrando a rodada Neste exemplo a explosão ocorre quando o multiplicador atinge aproximadamente valor previamente calculado com base no número de jogadores e no total apostado Esse ponto de explosão é obtido pela seguinte fórmula Todos os jogadores que não realizarem o até esse instante perdem suas apostas Por outro lado aqueles que sacarem antes recebem como pagamento o valor apostado multiplicado pelo valor do multiplicador vigente no momento da solicitação 6 Cálculo de lucro profit Cliente Jogador saca antes do aviãozinho explodir Aviãozinho explodiu antes do jogador sacar Servidor Exemplo Rodada 1 aposta 10000 ganha 20000 profit jogador 10000 profit casa 10000 recebeu 10000 pagou 20000 10000 Rodada 2 aposta 10000 perde profit jogador 000 10000 10000 profit casa 000 10000 10000 Rodada 3 aposta 10000 perde profit jogador 10000 000 10000 profit casa 10000 000 10000 Rodada 4 aposta 30000 ganha 40000 profit jogador 000 10000 40000 30000 profit casa 000 10000 40000 30000 7 Fluxo de uma Rodada 1 Coleta de apostas O servidor aguardará até que ao menos um cliente se conecte Assim que isso ocorrer uma contagem regressiva de 10 segundos será iniciada 2 Cálculo do ponto de explosão ao fechar a janela de apostas calculase com a fórmula acima 3 Decolagem Broadcast um loop interno envia mensagens multiplier a cada 100 ms com incremento iniciando em 4 Cashout quando o servidor recebe mensagem cashout de um cliente antes da explosão responde com o pagamento apostado multiplicador e exibe os profits atualizados 5 Explosão quando 𝑚 𝑚ₑ o aviãozinho explode para todos a Para os jogadores que não realizaram cashout suas apostas são perdidas e é exibido o profit individual atualizado para cada um além do profit da casa b Para os jogadores que já haviam sacado apenas o profit da casa é exibido após a explosão 6 Repete o fluxo 15 7 Alternativo Saída A desconexão pode ser iniciada tanto pelo cliente quanto pelo servidor Em ambos os casos o servidor registra o encerramento nos logs a Quando o cliente envia bye ou fecha o socket o servidor registra a desconexão e encerra a thread correspondente b Quando o servidor encerra ele envia bye a todos os clientes conectados que então finalizam suas conexões e exibem a mensagem de término OBS O profit será perdido quando o cliente ou servidor desconectar sem persistência 8 Exibição de logs no terminal do Servidor O formato abaixo ilustra todos os campos possíveis que podem ser registrados em uma linha de log do servidor Na prática a cada evento apenas os campos relevantes são exibidos Por exemplo em eventos de aposta são destacados o identificador do jogador id valor apostado bet número de jogadores N e valor total acumulado V eventevento ididjogador ou mmultiplicador mepontoexplosao Nnumerodejogadores Vvalortotalapostado betvalorapostado payoutvalorrecebido playerprofitlucroacumuladodojogador houseprofitlucroacumuladodoservidor Os eventos registrados são início de rodada fechamento da janela de apostas aposta realizada cashout atualização de multiplicador explosão do aviãozinho pagamento lucro e encerramento de conexões A tabela abaixo lista todos os possíveis tipos de evento registrados nos logs do servidor event start closed bet cashout multiplier explode payout profit bye Exemplo de logs do servidor asterisco representa todos os clientes Início da rodada eventstart id N3 Recebendo apostas de jogadores eventbet id1 bet2000 N1 V2000 eventbet id2 bet3000 N2 V5000 eventbet id3 bet2000 N3 V7000 Apostas encerradas eventclosed id N3 V7000 Multiplicador durante o voo eventmultiplier id m101 eventmultiplier id m102 eventmultiplier id m103 eventmultiplier id m145 Cashout bemsucedido de um jogador exemplo eventcashout id2 m145 eventpayout id2 payout4350 eventprofit id2 playerprofit1350 Continuação dos multiplicadores após cashout eventmultiplier id m146 eventmultiplier id m245 Explosão do avião eventexplode id m245 eventexplode id1 m245 eventprofit id1 playerprofit2000 eventexplode id3 m245 eventprofit id3 playerprofit2000 eventprofit id houseprofit2650 Caso o jogador de id1 emita o comando Q para desconectar bye eventbye id1 Caso o servidor emita o comando Q para se desconectar bye eventbye id 9 Exibição de logs no terminal do Cliente 1 Antes de apostar Rodada aberta Digite o valor da aposta ou digite Q para sair X segundos restantes 11 Logo após apostar Aposta recebida R XXXX 2 Após encerrar as apostas Apostas encerradas Não é mais possível apostar nesta rodada 21 Se tiver apostado Digite C para sacar 22 Atualização periódica de multiplicador Multiplicador atual 100x Multiplicador atual 101x Multiplicador atual 102x 23 Aviãozinho explodiu Aviãozinho explodiu em YYYx 231 Sacou antes do aviãozinho explodir Você sacou em YYYx e ganhou R XXXX 232 O aviãozinho explodiu antes de sacar Você perdeu R XXXX Tente novamente na próxima rodada Aviãozinho tá pagando 233 Profit atualizado após sacar ou explodir sem sacar Profit atual R XXXX 234 Profit atualizado do servidor após o aviãozinho explodir Profit da casa R XXXX 3 Após parar de jogar saiu Aposte com responsabilidade A plataforma é nova e tá com horário bugado Volte logonome 31 Encerramento do servidor saiu O servidor caiu mas sua esperança pode continuar de pé Até breve Sempre que um cliente é desconectado seja por solicitação do próprio cliente ou pelo encerramento do servidor o servidor deve Encerrar a thread dedicada ao cliente Remover o jogador das listas internas apostas e jogadores ativos Registrar o evento correspondente nos logs Como gerenciar clientes que se conectam em momentos distintos Caso 1 Cliente conectado antes do servidor anunciar uma nova rodada Ao anunciar nova rodada servidor envia start com a contagem regressiva 10s Rodada aberta Digite o valor da aposta ou digite Q para sair 10 segundos restantes Caso 2 Cliente conectado durante a janela de apostas aberta Imediatamente após a conexão o servidor informa o estado atual com o tempo restante por exemplo 6 segundos restantes Rodada aberta Digite o valor da aposta ou digite Q para sair 6 segundos restantes Caso 3 Cliente conectado após apostas fechadas durante o voo do aviãozinho O servidor informa imediatamente após a conexão que as apostas estão encerradas Apostas encerradas Não é mais possível apostar nesta rodada 10 Exemplo de Execução Terminal servidor Terminal Jogador 1 Terminal Jogador 2 server v4 51511 eventstart id N1 client 127001 51511 nick Flip Rodada aberta Digite o valor da aposta ou digite Q para sair 10 segundos restantes 50 eventbet id1 bet5000 N2 V5000 Aposta recebida R 5000 client 127001 51511 nick Flop Rodada aberta Digite o valor da aposta ou digite Q para sair 7 segundos restantes 50 eventbet id2 bet5000 N2 V10000 Aposta recebida R 5000 eventclosed id N2 V10000 Apostas encerradas Não é mais possível apostar nesta rodada Digite C para sacar Apostas encerradas Não é mais possível apostar nesta rodada Digite C para sacar eventmultiplier id m101 eventmultiplier id m102 Multiplicador atual 101x Multiplicador atual 102x Multiplicador atual 169x eventcashout id1 m170 eventpayout id1 payout8500 eventprofit id1 playerprofit3500 C Você sacou em 170x e ganhou R 8500 Profit atual R 3500 eventmultiplier id m199 eventexplode id m200 eventexplode id2 m200 eventprofit id2 playerprofit5000 eventprofit id houseprofit1500 Aviãozinho explodiu em 200x Profit da casa R 1500 Aviãozinho explodiu em 200x Você perdeu R 5000 Tente novamente na próxima rodada Aviãozinho tá pagando Profit atual R 5000 Profit da casa R 1500 eventstart id N2 Rodada aberta Digite o valor da aposta ou digite Q para sair Você tem 10 segundos para apostar X Rodada aberta Digite o valor da aposta ou digite Q para sair Você tem 10 segundos para apostar Q eventbye id2 Error Invalid command Aposte com responsabilidade A plataforma é nova e tá com horário bugado Volte logo Flop Rodada aberta Digite o valor da aposta ou digite Q para sair Você tem 8 segundos para apostar Q eventbye id Encerrando servidor O servidor caiu mas sua esperança pode continuar de pé Até breve O servidor caiu mas sua esperança pode continuar de pé Até breve 11 Desenvolvimento O projeto requer a implementação de dois componentes essenciais um servidor e um cliente ambos baseados no protocolo TCP É crucial garantir que ambos os componentes sejam compatíveis tanto com o IPv4 quanto com o IPv6 proporcionando flexibilidade na escolha do endereço IP Para configurar o servidor corretamente este deve ser capaz de receber seguindo rigorosamente essa ordem o tipo de endereço desejado v4 para IPv4 ou v6 para IPv6 e um número de porta especificado na linha de comando Recomendase a utilização da porta 51511 para manter a padronização do projeto Da mesma forma os clientes precisam receber também rigorosamente nessa ordem o endereço IP do servidor e o número de porta para estabelecer a conexão com sucesso Certifiquese de que ambos os componentes sejam configurados de acordo com essas diretrizes para uma integração eficaz e a comunicação adequada entre servidor e cliente A seguir um exemplo de execução dos programas em dois terminais distintos IPv4 no terminal 1 server v4 51511 no terminal 2 client 127001 51511 nick Flip no terminal 3 client 127001 51511 nick Flop IPv6 no terminal 1 server v6 51511 no terminal 2 client 1 51511 nick Flip no terminal 3 client 1 51511 nick Flop Sobre Threads O uso de threads em servidores é uma abordagem eficiente para lidar com múltiplas conexões simultâneas Em um servidor multithread cada cliente conectado é gerenciado por uma thread separada permitindo que o servidor processe várias requisições de forma paralela Essa arquitetura tem várias vantagens com talvez a principal de evitar que a execução de uma operação mais demorada por um cliente bloqueie o atendimento de outros garantindo maior responsividade do sistema No contexto deste trabalho prático o servidor será responsável por criar uma nova thread para cada cliente que se conecta Cada thread atuará de forma independente lidando com as mensagens daquele cliente Ao mesmo tempo o servidor principal continuará rodando em sua thread principal aceitando novas conexões sem interrupções Essa abordagem permite manter um fluxo contínuo de comunicação entre os clientes e o servidor assegurando que todas as mensagens sejam tratadas adequadamente mesmo em cenários com vários clientes conectados simultaneamente Para aqueles que não conhecem ou desejam relembrar esses conceitos recomendo essa playlist em especial os vídeos 5 6 e 7 Materiais para Consulta e Dicas Capítulo 2 e 3 do livro sobre programação com sockets disponibilizado no Moodle Playlist de programação com sockets do professor Ítalo Cunha O guia de programação em rede do Beej httpbeejusguidebgnet tem bons exemplos de como organizar um servidor Implemente o trabalho por partes Por exemplo implemente o tratamento das múltiplas conexões depois crie os formatos das mensagens e por fim trate os tópicos e as especificidades Procure resolver os desafios da maneira mais simples possível 12 Avaliação O trabalho deve ser realizado individualmente e deve ser implementado com a linguagem de programação C não sendo permitida a utilização de C utilizando somente a biblioteca padrão interface POSIX de sockets de redes Deve ser possível executar seu programa no sistema operacional Linux e não deve utilizar bibliotecas Windows como o winsock Seu programa deve interoperar com qualquer outro programa implementando o mesmo protocolo você pode testar com as implementações dos seus colegas Procure escrever seu código de maneira clara com comentários pontuais e bem indentados Isto facilita a correção dos monitores e tem impacto positivo na avaliação Seu servidor será corrigido de forma semiautomática por uma bateria de testes Cada teste verifica uma funcionalidade específica do servidor Para a correção os seguintes testes serão realizados com IPv4 e IPv6 Item Peso Conexão de múltiplos clientes 10 Sincronização e concorrência threads 15 Cálculo correto de difusão do multiplicador 15 Tratamento de cashout explosão payout e profit 15 Formato e exatidão dos logs 10 Fechamento de conexão 10 Tratativa de erros e argumentos 5 Documentação 20 13 Informações importantes Cada aluno deve entregar documentação em PDF de até 4 páginas duas folhas sem capa utilizando fonte Arial tamanho 12 e figuras de tamanho adequado ao tamanho da fonte A documentação deve discutir desafios dificuldades e imprevistos do projeto bem como as soluções adotadas para os problemas Atenção Será dado grande importância a parte da discussão dos desafios encontrados pois as dificuldades ao longo do projeto sempre existem A documentação corresponde a 20 dos pontos do trabalho mas só será considerada para as funcionalidades implementadas corretamente Será adotada média harmônica entre as notas da documentação e da execução o que implica que a nota final será 0 se uma das partes não for apresentada Cada aluno deve entregar além da documentação o código fonte em C e um Makefile para compilação do programa Instruções para submissão e compatibilidade com o sistema de correção semiautomática O Makefile deve compilar o cliente em um binário chamado client e o servidor em um binário chamado server dentro de uma pasta chamada bin na raiz do projeto Seu programa deve ser compilado com a execução do comando make ou seja sem a necessidade de parâmetros adicionais A entrega deve ser feita no formato ZIP com o nome seguindo o seguinte padrão TP2MATRICULAzip 14 Desconto de Nota por Atraso Os trabalhos poderão ser entregues até a meianoite do dia especificado para a entrega Não serão aceitos trabalhos com atraso 15 Detecção de Trapaça O trabalho prático desta disciplina NÃO aceitará trechos de código gerados por inteligência artificial especificamente LLMs Large Language Models Para garantir a integridade acadêmica utilizaremos um analisador baseado no estado da arte capaz de Detectar com alta precisão padrões e impressões digitais de plataformas como ChatGPT DeepSeek Gemini Claude e afins Identificar tentativas de ofuscação ou modificações em código ATENÇÃO NÃO HÁ atalhos possíveis qualquer sinal de código plagiado ou gerado resultará em nota ZERO Sejam criativos mas acima de tudo originais
20
Rede de Computadores
UFMG
16
Rede de Computadores
UFMG
1
Rede de Computadores
UFMG
25
Rede de Computadores
UFMG
25
Rede de Computadores
UFMG
43
Rede de Computadores
UFMG
16
Rede de Computadores
UFMG
20
Rede de Computadores
UFMG
16
Rede de Computadores
UFMG
26
Rede de Computadores
UFMG
Texto de pré-visualização
Trabalho prático 2 Aviãozinho Entrega individual Data de Entrega 22 de junho de 2025 às 2359 1 Introdução O Aviator popularmente chamado de jogo do aviãozinho é um jogo de cassino online em que um avião decola e o multiplicador de apostas 𝑚 sobe continuamente 100 101 102 até explodir Cada jogador aposta um valor antes da decolagem e pode solicitar cashout a qualquer momento durante o voo o pagamento é aposta 𝑚 do instante do pedido Se o avião explode antes do cashout o jogador perde a aposta 2 Objetivos Utilizar apenas as funcionalidades da biblioteca de sockets POSIX na linguagem C e a comunicação via protocolo TCP Implementar um servidor multithread capaz de aceitar e gerenciar múltiplas conexões simultâneas até 10 jogadores Implementar um cliente que se conecte ao servidor envie apostas efetue cashout e receba atualizações em tempo real Exibir logs padronizados no servidor e nos clientes Garantir compatibilidade com IPv4 e IPv6 3 Protocolo de comunicação Todas as mensagens são trocadas pelo socket TCP entre servidor e clientes utilizando a seguinte estrutura define STRLEN 11 struct aviatormsg int32t playerid float value char typeSTRLEN float playerprofit float houseprofit Significado dos campos playerid Um valor 1 atribuído pelo servidor único por conexão utilizado em todas as mensagens seguintes para identificar o jogador value Campo numérico em ponto flutuante float exibido sempre com duas casas decimais O significado específico depende do type e está detalhado na tabela abaixo Quando especificado como o campo não é utilizado e pode ser preenchido com zero ou qualquer valor padrão playerprofit Profit acumulado do jogador Indica o saldo de ganhos ou perdas do jogador durante a sessão houseprofit Profit acumulado do servidor casa Representa o saldo total de ganhos ou perdas do servidor em relação a todos os jogadores conectados na sessão type Origem value Descrição start Servidor Cliente Cronômetro de 10 segundos Marca o começo da rodada e realiza contagem regressiva closed Servidor Cliente Janela de apostas encerrada bet Cliente Servidor Valor da aposta Enviado antes da rodada começar só uma aposta por rodada cashout Cliente Servidor Pedido de saque O servidor calcula o multiplicador atual e responde multiplier Servidor Cliente Multiplicador atual Broadcast a cada 100 ms durante o voo explode Servidor Cliente Multiplicador final Indica explosão do avião apostas ainda não sacadas são perdidas payout Servidor Cliente Valor pago Pagamento ao cliente após um saque bem sucedido profit Servidor Cliente Profit acumulado Enviado após cashoutexplode para informar profit atualizado bye Bidirecional CS ou SC Encerramento da conexão 4 Inicialização dos programas Servidor server v4v6 port O servidor exige dois argumentos protocol v4 IPv4 v6 IPv6 port A porta na qual o servidor está ouvindo Exemplo server v4 51511 Cliente client serverip port nick apelido O cliente exige três argumentos serverip O IP ou hostname do servidor por exemplo 127001 se estiver na mesma máquina port A porta na qual o servidor está ouvindo deve ser igual à usada no servidor apelido Identificação do jogador Exemplo client 127001 51511 nick Flip Lista de erros obrigatórios a serem tratados no cliente em ordem de prioridade Descrição do erro Exemplo de comando Mensagem Número de argumentos incorreto client 127001 51511 nick Flip bet 10 Error Invalid number of arguments Flag nick ausente client 127001 51511 Flip Error Expected nick argument Apelido muito longo 13 client 127001 51511 nick FlipFlopFlaFlu Error Nickname too long max 13 Valor de aposta inválido 10 ou 0 Error Invalid bet value Caractere inválido Diferente de C Diferente de Q Error Invalid command OBS Não é necessário tratar erros fora da lista 5 Cálculo do ponto de explosão A explosão do avião ocorre em um ponto calculado dinamicamente a cada rodada com base no número de jogadores ativos e no total apostado O objetivo é garantir uma variação natural de multiplicadores entre rodadas ao mesmo tempo em que se preserva a vantagem da casa O ponto de explosão é definido pelo multiplicador máximo da rodada denotado por Este valor é calculado pelo servidor segundo a seguinte fórmula Onde é o número de jogadores que apostaram na rodada é o valor total apostado na rodada calculado como o somatório das apostas individuais de todos os jogadores com sendo o valor apostado pelo jogador é o expoente de suavização que define o crescimento do multiplicador de explosão Por padrão neste trabalho será utilizado ou seja aplicaremos a raiz quadrada da expressão interna A constante é utilizada para normalizar o valor monetário das apostas de modo que seu peso na fórmula seja proporcional ao número de jogadores Substituindo a fórmula final da explosão tornase Este será o limite máximo do multiplicador O avião explode assim que o valor atual do multiplicador enviado pelo servidor atinge ou ultrapassa Após a explosão todas as apostas que não realizaram cashout são consideradas perdidas Exemplo Se houver 4 jogadores e as apostas forem R10 R25 R15 e R50 O avião irá explodir quando o multiplicador atingir aproximadamente 245x O gráfico acima ilustra o crescimento linear do multiplicador ao longo do tempo A linha vermelha tracejada marca o exato momento em que o avião explode encerrando a rodada Neste exemplo a explosão ocorre quando o multiplicador atinge aproximadamente valor previamente calculado com base no número de jogadores e no total apostado Esse ponto de explosão é obtido pela seguinte fórmula Todos os jogadores que não realizarem o até esse instante perdem suas apostas Por outro lado aqueles que sacarem antes recebem como pagamento o valor apostado multiplicado pelo valor do multiplicador vigente no momento da solicitação 6 Cálculo de lucro profit Cliente Jogador saca antes do aviãozinho explodir Aviãozinho explodiu antes do jogador sacar Servidor Exemplo Rodada 1 aposta 10000 ganha 20000 profit jogador 10000 profit casa 10000 recebeu 10000 pagou 20000 10000 Rodada 2 aposta 10000 perde profit jogador 000 10000 10000 profit casa 000 10000 10000 Rodada 3 aposta 10000 perde profit jogador 10000 000 10000 profit casa 10000 000 10000 Rodada 4 aposta 30000 ganha 40000 profit jogador 000 10000 40000 30000 profit casa 000 10000 40000 30000 7 Fluxo de uma Rodada 1 Coleta de apostas O servidor aguardará até que ao menos um cliente se conecte Assim que isso ocorrer uma contagem regressiva de 10 segundos será iniciada 2 Cálculo do ponto de explosão ao fechar a janela de apostas calculase com a fórmula acima 3 Decolagem Broadcast um loop interno envia mensagens multiplier a cada 100 ms com incremento iniciando em 4 Cashout quando o servidor recebe mensagem cashout de um cliente antes da explosão responde com o pagamento apostado multiplicador e exibe os profits atualizados 5 Explosão quando 𝑚 𝑚ₑ o aviãozinho explode para todos a Para os jogadores que não realizaram cashout suas apostas são perdidas e é exibido o profit individual atualizado para cada um além do profit da casa b Para os jogadores que já haviam sacado apenas o profit da casa é exibido após a explosão 6 Repete o fluxo 15 7 Alternativo Saída A desconexão pode ser iniciada tanto pelo cliente quanto pelo servidor Em ambos os casos o servidor registra o encerramento nos logs a Quando o cliente envia bye ou fecha o socket o servidor registra a desconexão e encerra a thread correspondente b Quando o servidor encerra ele envia bye a todos os clientes conectados que então finalizam suas conexões e exibem a mensagem de término OBS O profit será perdido quando o cliente ou servidor desconectar sem persistência 8 Exibição de logs no terminal do Servidor O formato abaixo ilustra todos os campos possíveis que podem ser registrados em uma linha de log do servidor Na prática a cada evento apenas os campos relevantes são exibidos Por exemplo em eventos de aposta são destacados o identificador do jogador id valor apostado bet número de jogadores N e valor total acumulado V eventevento ididjogador ou mmultiplicador mepontoexplosao Nnumerodejogadores Vvalortotalapostado betvalorapostado payoutvalorrecebido playerprofitlucroacumuladodojogador houseprofitlucroacumuladodoservidor Os eventos registrados são início de rodada fechamento da janela de apostas aposta realizada cashout atualização de multiplicador explosão do aviãozinho pagamento lucro e encerramento de conexões A tabela abaixo lista todos os possíveis tipos de evento registrados nos logs do servidor event start closed bet cashout multiplier explode payout profit bye Exemplo de logs do servidor asterisco representa todos os clientes Início da rodada eventstart id N3 Recebendo apostas de jogadores eventbet id1 bet2000 N1 V2000 eventbet id2 bet3000 N2 V5000 eventbet id3 bet2000 N3 V7000 Apostas encerradas eventclosed id N3 V7000 Multiplicador durante o voo eventmultiplier id m101 eventmultiplier id m102 eventmultiplier id m103 eventmultiplier id m145 Cashout bemsucedido de um jogador exemplo eventcashout id2 m145 eventpayout id2 payout4350 eventprofit id2 playerprofit1350 Continuação dos multiplicadores após cashout eventmultiplier id m146 eventmultiplier id m245 Explosão do avião eventexplode id m245 eventexplode id1 m245 eventprofit id1 playerprofit2000 eventexplode id3 m245 eventprofit id3 playerprofit2000 eventprofit id houseprofit2650 Caso o jogador de id1 emita o comando Q para desconectar bye eventbye id1 Caso o servidor emita o comando Q para se desconectar bye eventbye id 9 Exibição de logs no terminal do Cliente 1 Antes de apostar Rodada aberta Digite o valor da aposta ou digite Q para sair X segundos restantes 11 Logo após apostar Aposta recebida R XXXX 2 Após encerrar as apostas Apostas encerradas Não é mais possível apostar nesta rodada 21 Se tiver apostado Digite C para sacar 22 Atualização periódica de multiplicador Multiplicador atual 100x Multiplicador atual 101x Multiplicador atual 102x 23 Aviãozinho explodiu Aviãozinho explodiu em YYYx 231 Sacou antes do aviãozinho explodir Você sacou em YYYx e ganhou R XXXX 232 O aviãozinho explodiu antes de sacar Você perdeu R XXXX Tente novamente na próxima rodada Aviãozinho tá pagando 233 Profit atualizado após sacar ou explodir sem sacar Profit atual R XXXX 234 Profit atualizado do servidor após o aviãozinho explodir Profit da casa R XXXX 3 Após parar de jogar saiu Aposte com responsabilidade A plataforma é nova e tá com horário bugado Volte logonome 31 Encerramento do servidor saiu O servidor caiu mas sua esperança pode continuar de pé Até breve Sempre que um cliente é desconectado seja por solicitação do próprio cliente ou pelo encerramento do servidor o servidor deve Encerrar a thread dedicada ao cliente Remover o jogador das listas internas apostas e jogadores ativos Registrar o evento correspondente nos logs Como gerenciar clientes que se conectam em momentos distintos Caso 1 Cliente conectado antes do servidor anunciar uma nova rodada Ao anunciar nova rodada servidor envia start com a contagem regressiva 10s Rodada aberta Digite o valor da aposta ou digite Q para sair 10 segundos restantes Caso 2 Cliente conectado durante a janela de apostas aberta Imediatamente após a conexão o servidor informa o estado atual com o tempo restante por exemplo 6 segundos restantes Rodada aberta Digite o valor da aposta ou digite Q para sair 6 segundos restantes Caso 3 Cliente conectado após apostas fechadas durante o voo do aviãozinho O servidor informa imediatamente após a conexão que as apostas estão encerradas Apostas encerradas Não é mais possível apostar nesta rodada 10 Exemplo de Execução Terminal servidor Terminal Jogador 1 Terminal Jogador 2 server v4 51511 eventstart id N1 client 127001 51511 nick Flip Rodada aberta Digite o valor da aposta ou digite Q para sair 10 segundos restantes 50 eventbet id1 bet5000 N2 V5000 Aposta recebida R 5000 client 127001 51511 nick Flop Rodada aberta Digite o valor da aposta ou digite Q para sair 7 segundos restantes 50 eventbet id2 bet5000 N2 V10000 Aposta recebida R 5000 eventclosed id N2 V10000 Apostas encerradas Não é mais possível apostar nesta rodada Digite C para sacar Apostas encerradas Não é mais possível apostar nesta rodada Digite C para sacar eventmultiplier id m101 eventmultiplier id m102 Multiplicador atual 101x Multiplicador atual 102x Multiplicador atual 169x eventcashout id1 m170 eventpayout id1 payout8500 eventprofit id1 playerprofit3500 C Você sacou em 170x e ganhou R 8500 Profit atual R 3500 eventmultiplier id m199 eventexplode id m200 eventexplode id2 m200 eventprofit id2 playerprofit5000 eventprofit id houseprofit1500 Aviãozinho explodiu em 200x Profit da casa R 1500 Aviãozinho explodiu em 200x Você perdeu R 5000 Tente novamente na próxima rodada Aviãozinho tá pagando Profit atual R 5000 Profit da casa R 1500 eventstart id N2 Rodada aberta Digite o valor da aposta ou digite Q para sair Você tem 10 segundos para apostar X Rodada aberta Digite o valor da aposta ou digite Q para sair Você tem 10 segundos para apostar Q eventbye id2 Error Invalid command Aposte com responsabilidade A plataforma é nova e tá com horário bugado Volte logo Flop Rodada aberta Digite o valor da aposta ou digite Q para sair Você tem 8 segundos para apostar Q eventbye id Encerrando servidor O servidor caiu mas sua esperança pode continuar de pé Até breve O servidor caiu mas sua esperança pode continuar de pé Até breve 11 Desenvolvimento O projeto requer a implementação de dois componentes essenciais um servidor e um cliente ambos baseados no protocolo TCP É crucial garantir que ambos os componentes sejam compatíveis tanto com o IPv4 quanto com o IPv6 proporcionando flexibilidade na escolha do endereço IP Para configurar o servidor corretamente este deve ser capaz de receber seguindo rigorosamente essa ordem o tipo de endereço desejado v4 para IPv4 ou v6 para IPv6 e um número de porta especificado na linha de comando Recomendase a utilização da porta 51511 para manter a padronização do projeto Da mesma forma os clientes precisam receber também rigorosamente nessa ordem o endereço IP do servidor e o número de porta para estabelecer a conexão com sucesso Certifiquese de que ambos os componentes sejam configurados de acordo com essas diretrizes para uma integração eficaz e a comunicação adequada entre servidor e cliente A seguir um exemplo de execução dos programas em dois terminais distintos IPv4 no terminal 1 server v4 51511 no terminal 2 client 127001 51511 nick Flip no terminal 3 client 127001 51511 nick Flop IPv6 no terminal 1 server v6 51511 no terminal 2 client 1 51511 nick Flip no terminal 3 client 1 51511 nick Flop Sobre Threads O uso de threads em servidores é uma abordagem eficiente para lidar com múltiplas conexões simultâneas Em um servidor multithread cada cliente conectado é gerenciado por uma thread separada permitindo que o servidor processe várias requisições de forma paralela Essa arquitetura tem várias vantagens com talvez a principal de evitar que a execução de uma operação mais demorada por um cliente bloqueie o atendimento de outros garantindo maior responsividade do sistema No contexto deste trabalho prático o servidor será responsável por criar uma nova thread para cada cliente que se conecta Cada thread atuará de forma independente lidando com as mensagens daquele cliente Ao mesmo tempo o servidor principal continuará rodando em sua thread principal aceitando novas conexões sem interrupções Essa abordagem permite manter um fluxo contínuo de comunicação entre os clientes e o servidor assegurando que todas as mensagens sejam tratadas adequadamente mesmo em cenários com vários clientes conectados simultaneamente Para aqueles que não conhecem ou desejam relembrar esses conceitos recomendo essa playlist em especial os vídeos 5 6 e 7 Materiais para Consulta e Dicas Capítulo 2 e 3 do livro sobre programação com sockets disponibilizado no Moodle Playlist de programação com sockets do professor Ítalo Cunha O guia de programação em rede do Beej httpbeejusguidebgnet tem bons exemplos de como organizar um servidor Implemente o trabalho por partes Por exemplo implemente o tratamento das múltiplas conexões depois crie os formatos das mensagens e por fim trate os tópicos e as especificidades Procure resolver os desafios da maneira mais simples possível 12 Avaliação O trabalho deve ser realizado individualmente e deve ser implementado com a linguagem de programação C não sendo permitida a utilização de C utilizando somente a biblioteca padrão interface POSIX de sockets de redes Deve ser possível executar seu programa no sistema operacional Linux e não deve utilizar bibliotecas Windows como o winsock Seu programa deve interoperar com qualquer outro programa implementando o mesmo protocolo você pode testar com as implementações dos seus colegas Procure escrever seu código de maneira clara com comentários pontuais e bem indentados Isto facilita a correção dos monitores e tem impacto positivo na avaliação Seu servidor será corrigido de forma semiautomática por uma bateria de testes Cada teste verifica uma funcionalidade específica do servidor Para a correção os seguintes testes serão realizados com IPv4 e IPv6 Item Peso Conexão de múltiplos clientes 10 Sincronização e concorrência threads 15 Cálculo correto de difusão do multiplicador 15 Tratamento de cashout explosão payout e profit 15 Formato e exatidão dos logs 10 Fechamento de conexão 10 Tratativa de erros e argumentos 5 Documentação 20 13 Informações importantes Cada aluno deve entregar documentação em PDF de até 4 páginas duas folhas sem capa utilizando fonte Arial tamanho 12 e figuras de tamanho adequado ao tamanho da fonte A documentação deve discutir desafios dificuldades e imprevistos do projeto bem como as soluções adotadas para os problemas Atenção Será dado grande importância a parte da discussão dos desafios encontrados pois as dificuldades ao longo do projeto sempre existem A documentação corresponde a 20 dos pontos do trabalho mas só será considerada para as funcionalidades implementadas corretamente Será adotada média harmônica entre as notas da documentação e da execução o que implica que a nota final será 0 se uma das partes não for apresentada Cada aluno deve entregar além da documentação o código fonte em C e um Makefile para compilação do programa Instruções para submissão e compatibilidade com o sistema de correção semiautomática O Makefile deve compilar o cliente em um binário chamado client e o servidor em um binário chamado server dentro de uma pasta chamada bin na raiz do projeto Seu programa deve ser compilado com a execução do comando make ou seja sem a necessidade de parâmetros adicionais A entrega deve ser feita no formato ZIP com o nome seguindo o seguinte padrão TP2MATRICULAzip 14 Desconto de Nota por Atraso Os trabalhos poderão ser entregues até a meianoite do dia especificado para a entrega Não serão aceitos trabalhos com atraso 15 Detecção de Trapaça O trabalho prático desta disciplina NÃO aceitará trechos de código gerados por inteligência artificial especificamente LLMs Large Language Models Para garantir a integridade acadêmica utilizaremos um analisador baseado no estado da arte capaz de Detectar com alta precisão padrões e impressões digitais de plataformas como ChatGPT DeepSeek Gemini Claude e afins Identificar tentativas de ofuscação ou modificações em código ATENÇÃO NÃO HÁ atalhos possíveis qualquer sinal de código plagiado ou gerado resultará em nota ZERO Sejam criativos mas acima de tudo originais