Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
YaboiAst committed Aug 15, 2023
2 parents 15768f3 + 9c82025 commit ebd0271
Showing 1 changed file with 48 additions and 5 deletions.
53 changes: 48 additions & 5 deletions tcp.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import asyncio
import random
import sys
from tcputils import *
##

class Servidor:
def __init__(self, rede, porta):
self.rede = rede
Expand All @@ -17,12 +19,24 @@ def registrar_monitor_de_conexoes_aceitas(self, callback):
self.callback = callback

def _rdt_rcv(self, src_addr, dst_addr, segment):
src_port, dst_port, seq_no, ack_no, \
flags, window_size, checksum, urg_ptr = read_header(segment)
# precisamos adquirir parametros do header
(
src_port,
dst_port,
seq_no,
ack_no,
flags,
window_size,
checksum,
urg_ptr
) = read_header(segment)
# src_port, dst_port, seq_no, ack_no, \
# flags, window_size, checksum, urg_ptr = read_header(segment)

if dst_port != self.porta:
# Ignora segmentos que não são destinados à porta do nosso servidor
return

if not self.rede.ignore_checksum and calc_checksum(segment, src_addr, dst_addr) != 0:
print('descartando segmento com checksum incorreto')
return
Expand All @@ -33,7 +47,14 @@ def _rdt_rcv(self, src_addr, dst_addr, segment):
if (flags & FLAGS_SYN) == FLAGS_SYN:
# A flag SYN estar setada significa que é um cliente tentando estabelecer uma conexão nova
# TODO: talvez você precise passar mais coisas para o construtor de conexão
conexao = self.conexoes[id_conexao] = Conexao(self, id_conexao)
conexao = self.conexoes[id_conexao] = Conexao(self, id_conexao, seq_no)
response = fix_checksum(
make_header(dst_port, src_port, seq_no, seq_no+1, FLAGS_ACK | FLAGS_SYN),
dst_addr,
src_addr)
self.rede.enviar(response, src_addr)
conexao.expected_seq = seq_no + 1
#print("retornando", response)
# TODO: você precisa fazer o handshake aceitando a conexão. Escolha se você acha melhor
# fazer aqui mesmo ou dentro da classe Conexao.
if self.callback:
Expand All @@ -47,12 +68,15 @@ def _rdt_rcv(self, src_addr, dst_addr, segment):


class Conexao:
def __init__(self, servidor, id_conexao):
def __init__(self, servidor, id_conexao, seq_no):
self.servidor = servidor
self.id_conexao = id_conexao
self.callback = None
self.timer = asyncio.get_event_loop().call_later(1, self._exemplo_timer) # um timer pode ser criado assim; esta linha é só um exemplo e pode ser removida
#self.timer.cancel() # é possível cancelar o timer chamando esse método; esta linha é só um exemplo e pode ser removida
self.expected_seq = 0
self.seq_no = seq_no
self.ack_no = seq_no + 1

def _exemplo_timer(self):
# Esta função é só um exemplo e pode ser removida
Expand All @@ -62,8 +86,27 @@ def _rdt_rcv(self, seq_no, ack_no, flags, payload):
# TODO: trate aqui o recebimento de segmentos provenientes da camada de rede.
# Chame self.callback(self, dados) para passar dados para a camada de aplicação após
# garantir que eles não sejam duplicados e que tenham sido recebidos em ordem.
#
# print(seq_no, self.expected_seq)
# if seq_no != self.expected_seq:
# #print(seq_no, ": expected ", self.expected_seq)
# return

print('recebido payload: %r' % payload)

# ACK
# src_addr, src_port, dst_addr, dst_port = self.id_conexao
# response = fix_checksum(make_header(dst_port, src_port, self.ack_no, self.seq_no, FLAGS_ACK), dst_addr, src_addr)
# self.servidor.rede.enviar(response, dst_addr)
src_addr, src_port, dst_addr, dst_port = self.id_conexao
if(self.ack_no == seq_no and len(payload) > 0):
self.callback(self, payload)
self.ack_no += len(payload)
header = fix_checksum(make_header(dst_port, src_port, self.seq_no, self.ack_no, FLAGS_ACK), dst_addr, src_addr)
self.servidor.rede.enviar(header, src_addr)

# self.expected_seq = seq_no + len(payload)

# Os métodos abaixo fazem parte da API

def registrar_recebedor(self, callback):
Expand Down

0 comments on commit ebd0271

Please sign in to comment.