From e59218dca20a6ab62a100b2a8386b4fd95be2bae Mon Sep 17 00:00:00 2001 From: Fernando Erd <fce15@inf.ufpr.br> Date: Sun, 13 Nov 2016 19:19:58 -0200 Subject: [PATCH] o mais perto --- repo.py | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100755 repo.py diff --git a/repo.py b/repo.py new file mode 100755 index 0000000..ed499c7 --- /dev/null +++ b/repo.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python +#################### Protocol ################################################################# +# Marca - Tipo - Destino - Origem - Prioridade - Tamanho - Inic MSG - Mensagem - Fim MSG - CRC# +############################################################################################### + +#Marca - 1 Byte Marca inicio de transmissao, inicio de msg fim de msg +#Tipo - 0 Token, 1 - Msg, 2 - ACK, 3 - NACK +#Destino - pode variar de 1 a 4 +#Origem - pode variar de 1 a 4 +#Prioridade - pode variar de 0 a 7 +#Tamanho - tanto faz +#Marca (inicio msg) - 1 Byte +#Mensagem +#CRC - 8 bytes + +#Exemplo msg# +#~11313~oie~352D1036 +# ~ - inic transmissao +# 1 - tipo da mensagem +# 1 - destino da mensagem +# 3 - origem da mensagem +# 1 - prioridade da mensagem +# 3 - tamanho da string da mensagem +# ~ - delimitador de inicio da mensagem +# oie - mensagem +# ~ - delimitador de fim da mensagem +# 352D1036 - CRC + +import socket +import threading +import sys +import binascii +import time +import Queue + +global TOKEN +global StartTime +global HighPriority +global RECEBIDA +global PRIORITY_TOKEN +PRIORITY_TOKEN = 8 +RECEBIDA = 1 +StartTime = 0 +HighPriority = 10 +TOKEN = 0 +SEND_PORT = 3131 # Porta que o Servidor envia +RECV_PORT = 3131 # Porta que o Servidor recebe + +class Protocol(): + + def __init__ (self): + self.marca = "~" #Marca + self.type = str(1) #Alterar Depois + self.destiny = str(0) + self.origin = str(MACHINE_ID) + self.priority = str(0) + self.msg = str(0) + self.sizemsg = str(0) + self.crc = str(0) + + #set destiny message + def setDestiny(self): + sys.stdout.write('Destino: ') + self.destiny = raw_input() + while (0 >= int(self.destiny)) or (int(self.destiny) >= 5): + print 'Entrada Invalida, Por favor escolha entre 1 a 4' + sys.stdout.write('Destino: ') + self.destiny = raw_input() + self.destiny = str(self.destiny) + + #set Priority messsage + def setPriority(self): + sys.stdout.write('Prioridade: ') + self.priority = raw_input() + while (0 >= int(self.priority)) or (int(self.priority) >= 8): + print 'Entrada Invalida, Por favor escolha entre 1 a 7' + sys.stdout.write('Prioridade: ') + self.priority = raw_input() + self.priority = 7 - int(self.priority) + + #set message + def setMessage(self): + sys.stdout.write('Mensagem: ') + self.msg = raw_input() + + #set sizeof message + def setSizeof (self): + self.sizemsg = len(self.msg) + self.sizemsg = str(self.sizemsg) #String convert + + #set CRC32 + def setCRC32(self): + buff = (binascii.crc32(self.msg) & 0xFFFFFFFF) + self.crc = "%08X" % buff + + def getEmpacotar(self): + return self.marca + self.type + self.destiny + self.origin + str(self.priority) + self.sizemsg + self.marca + self.msg + self.marca + self.crc + + def setDesempacota(self, msg): + self.marca = msg[0] + self.type = msg[1] + self.destiny = str(msg[2]) + self.origin = msg[3] + self.priority = msg[4] + self.msg = msg.split('~', 3)[2] + self.crc = msg.split('~', 3)[3] + + def getCRC32(self): + buff = (binascii.crc32(self.msg) & 0xFFFFFFFF) + return "%08X" % buff + + +def token (): + global TOKEN + global queue + global PRIORITY_TOKEN + udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + tokenMessage = Protocol() + msgProtocol = Protocol() + dest = (HOST, SEND_PORT) + if (TOKEN == 2): + TOKEN = 0 + tokenMessage.type = str(0) + tokenMessage.priority = str(PRIORITY_TOKEN) + msg = tokenMessage.getEmpacotar() + udp.sendto (msg,dest) + if (not queue.empty() and TOKEN == 1): + top = queue.queue[0] + if (int(PRIORITY_TOKEN) >= int(top[0])): + top = queue.get() + msgProtocol.setDesempacota(top[1]) + msgProtocol.priority = str(7) + msg = msgProtocol.getEmpacotar() + udp.sendto (top[1], dest) + time.sleep(1) + return True + else: + return False + udp.close() + +def client (): + try: + global TOKEN + protocolMessage = Protocol() + global queue + queue = Queue.PriorityQueue() + while True: + protocolMessage.setDestiny() + protocolMessage.setPriority() + protocolMessage.setMessage() + protocolMessage.type = str(1) + protocolMessage.setSizeof() + protocolMessage.setCRC32() + msg = protocolMessage.getEmpacotar() + queue.put ((protocolMessage.priority, msg)) + threadServer._Thread__stop() + except: + print 'OPS, ALGO OCORREU ERRADO' + threadServer._Thread__stop() + +def server (): + global TOKEN + global StartTime + global RECEBIDA + global queue + global PRIORITY_TOKEN + global TOKEN_MSG + udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + orig = ('', RECV_PORT) + dest = (HOST, SEND_PORT) + udp.bind(orig) + protocolDescompactMessage = Protocol() + aux1 = Protocol() + aux2 = Protocol() + while True: + msg, cliente = udp.recvfrom(1024) + protocolDescompactMessage.setDesempacota(msg) + + if (protocolDescompactMessage.type == '1' and int(MACHINE_ID) == int(protocolDescompactMessage.origin)): + #print 'SETANDO A PRIORIDADE do TOKEN' + #print protocolDescompactMessage.priority + + PRIORITY_TOKEN = protocolDescompactMessage.priority + TOKEN = 2 + token() + #print 'EU RECEBI A MSG QUE ENVIEI' + + elif (protocolDescompactMessage.type == '0' and TOKEN == 0): + #print 'RECEBI O TOKEN' + TOKEN = 1 + if (token() == False): + #print 'Vou enviar o token' + TOKEN = 0 + udp.sendto(msg,dest) + + #A msg e pra mim + elif (msg[1] == '1' and int(MACHINE_ID) == int(protocolDescompactMessage.destiny)): + + udp.sendto(msg,dest) + if (protocolDescompactMessage.crc == protocolDescompactMessage.getCRC32()): + print '\n' + protocolDescompactMessage.origin + ' Escreveu: ' + protocolDescompactMessage.msg + else: + print 'ERRO DE MENSAGEM' + + #A msg n e pra mim + elif (msg[1] == '1'): + if (not queue.empty()): + top = queue.queue[0] + HighPriorat = int(top[0]) + if (HighPriorat < int(msg[4])): + aux1.setDesempacota(msg) + aux1.priority = str(HighPriorat) + msg = aux1.getEmpacotar() + print msg + udp.sendto (msg, dest) + + udp.close() + +#------------------MAIN-----------------# + +if len(sys.argv) > 1: + TOKEN = 2 + print 'COMECEI COM O TOKEN' + PRIORITY_TOKEN = 7 + StartTime = time.time() +print 'ID Dessa maquina, escolha entre 1 e 4' +MACHINE_ID = raw_input () +print "Ip da proxima maquina" +HOST = raw_input() +if TOKEN == 1: + StartTime = time.time() +threadServer = threading.Thread(target=server) +threadClient = threading.Thread(target=client) +threadServer.start() +threadClient.start() +token() -- GitLab