DCC023: Redes de Computadores
2015/1

TP0: Problema dos generais -- Parte 1

Liberado: Quinta, 5 de março.
Entrega: Segunda, 23 de março.
Grupo de 2 alunos.

Introdução

Neste trabalho iremos implementar um programa para resolver o problema dos generais e decidir o horário de um ataque à uma cidade sitiada. As mensagens serão trocadas utilizando um protocolo pré-definido utilizando UDP.

Protocolo

Como o problema dos dois 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 mostrada abaixo.

A princípio, ambos 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 e o protocolo termina (em outras palavras, o general vai dormir e mensagens futuras serão ignoradas).

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.

Se os dois generais iniciarem o protocolo em instantes muito próximos, ambos os generais irão sair do estado inicial para o estado proposta. Para cobrir esse caso, definimos que o ataque será realizado no horário proposto mais tarde (longe).

Tarefa individual valendo três pontos extras: Proponha modificações no protocolo para cobrir o caso acima. Esta tarefa deve ser entregue até 10 de março. Se nenhuma modificação for apresentada no prazo, o professor irá apresentar a solução em sala no dia 11 de março.

Formato das mensagens

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 OK
	

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.

O que deve ser entregue

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.

Clarificações e dicas

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.