Simple socket server in Python
Para esta etapa, foi implementado um protocolo onde:
- O cliente deseja enviar uma mensagem ao servidor. O cliente deve informar ao servidor o tamanho da mensagem que deseja-se enviar. Logo após o envio desta informação, o cliente envia a mensagem e aguarda uma resposta de recebimento do servidor.
- O servidor por sua vez aguarda uma primeira mensagem que deve conter o tamanho da "mensagem real" que o cliente deseja enviar. Ao receber estes dados o servidor se prepara para receber esta mensagem. Ele verifica se todos os dados foram recebidos, e caso obtenha sucesso, envia uma mensagem de confirmação ao cliente.
Para testar, rodar o script do servidor em um terminal:
cd etapa1
python3 serv.py
Em outro terminal, rodar o script do client:
cd etapa1/
python3 cli.py
O código do cliente permite que seja enviado um arquivo .txt. Para facilitar o teste de envio de grandes quantidades de dados, o diretório da etapa já contém um arquivo chamado "input.txt", que contém 16385 bytes em caracteres "A".
Para esta etapa foi implementado, sobre um código básico disponibilizado pelo professor Paulo Matias, características de um TCP, como os Handshakes inicial e final, transmissão correta de segmentos, controle de congestionamento e retransmissão após timeout.
Para rodar o script em um terminal:
cd etapa2/
python3 serv.py
Em outro terminal, rodar o script:
wget localhost:7000
Gerando, ao fim, um arquivo index.html com a mensagem enviada ao cliente.
Para esta etapa foi implementado, sobre um exemplo disponibilizado pelo professor Paulo Matias, a interpretação de cabeçalho IP e a reconstrução de datagramas IP fragmentados (mesmo com os fragmentos chegando fora de ordem), assim como o timeout sobre esses datagramas (caso os fragmentos não se completem dentro de determinado tempo).
Inicialmente, pegue o ip do seu router:
ip route
Substitua-o na variável "dest_addr" no código host.py, em etapa3/.
Para rodar o script em um terminal:
cd etapa3/
python3 host.py
Para a etapa 4 foram verificados os MAC adresses e IPs da máquina pessoal e do router local. Então, modificou-se este código exemplo disponibilizado pelo professor Paulo Matias, para fazer verificação desses endereços no momento do recebimento do frame.
Por fim, integrou-se o código resultante com o da etapa 3.
Para a etapa 5 foram juntadas a etapa 4, a qual já estava integrada com a etapa 3, com a etapa 2.