Neste trabalho iremos aprimorar o código realizado no TP0 para permitir sincronização entre vários generais.
Como o problema dos generais não possui solução, neste trabalho iremos utilizar o seguinte protocolo para combinar o horário do ataque. Nosso protocolo segue a máquina de estados descrita abaixo.
A princípio, todos os generais estão no estado inicial. Quando um general decide um horário para o ataque, ele envia um mensageiro e muda para o estado proposta.
No estado proposta, o general espera por uma resposta. Enquanto uma resposta não é recebida, o general envia outro mensageiro a cada dois segundos repetindo sua proposta. Quando o general recebe uma resposta, ele envia uma mensagem de confirmação do horário do ataque e muda para o estado confirmação.
No estado confirmação, o general escuta por mensagens de resposta. Sempre que escutar uma mensagem de resposta, o general reseta o temporizador de confirmação com o valor de dez segundos e reenvia a mensagem de confirmação. Se o temporizador de confirmação expirar, então o ataque está combinado com aquele general. O protoclo continua executando até que o ataque seja combinado entre todos os generais.
Quando um general está no estado inicial e recebe uma mensagem de proposta, ele responde a proposta e muda para o estado resposta. Enquanto no estado resposta, o general espera por uma mensagem de confirmação. Enquanto a mensagem de confirmação não é recebida, ele reenvia a resposta à proposta a cada dois segundos. Quando a mensagem de confirmação é recebida, o protocolo termina.
O ataque será realizado no horário mais tarde (longe) dentre todos os horários propostos. Sempre que um general recebe uma proposta de ataque mais ao futuro que a proposta atual, ele deve atualizar sua proposta atual, voltar ao estado proposta e reenviar a nova proposta para todos os outros generais. Propostas de ataque mais cedo que o horário atual devem ser ignoradas.
O protocolo possui três tipos de mensagens: mensagens de proposta, mensagens de resposta e mensagens de confirmação. Nossas mensagens serão transmitidas via protocolo UDP. Soquetes UDP são criados com socket(AF_INET, SOCK_DGRAM, 0). Mensagens UDP podem ser perdidas na rede (similar a mensageiros capturados), então seu programa deve implementar o protocolo proposto à risca. Cada mensagem é uma simples linha de texto.
Uma mensagem de proposta tem o formato abaixo. Note que o tamanho da mensagem é fixo, o que facilita seu processamento. HH, MM, AAAA, MM, DD abaixo correspondem às horas, minutos, ano, mês e dia proposto para o ataque.
proposta HHMM AAAAMMDD
Uma mensagem de resposta é similar e tem o seguinte formato. Novamente, a mensagem tem tamanho fixo e as letras tem o mesmo significado das mensagens de proposta.
resposta HHMM AAAAMMDD
Note que retiramos o OK que existia no TP0A. Isto facilita o processamento das mensagens.
Por fim, a mensagem de confirmação tem o seguinte formato:
confirmacao HHMM AAAAMMDD
O trabalho deve ser implementado em C, utilizando apenas funções da biblioteca padrão.
Seu programa deve suportar a chamada pela linha de comando recebendo os sequintes parâmetros:
general porta-local N-generais porta-1 porta-2 ... porta-(N-1) [HHMM YYYYmmdd]
Onde porta-local identifica a porta que é usada por esta instância do programa, e porta-X identifica as portas usadas pelas outras instâncias. Se os parâmetros opcionais de hora e data forem passados, o programa deve enviar esta proposta às outras instâncias.
Deve ser entregue o código do programa para execução do protocolo. Seu programa deve receber um parâmetro indicando se ele deve enviar uma proposta de horário ao iniciar ou se deve esperar uma proposta de horário.
Documentação é opcional. Se entregue, deve ser em formato PDF e ter no máximo duas páginas.
A correção do trabalho será semi-automática utilizando uma versão do programa implementada pelo professor. Teste seu programa com o programa de outros alunos.
Teste o caso onde os dois generais enviam propostas de ataque ao mesmo tempo. Este caso será coberto na correção.