class ReceptorUDP:
    mensajesRecibidos = MensajesRecibidos()
    tablaAlcanzabilidad = TablaAlcanzabilidad()

    def __init__(self, mensajesRecibidos, tablaAlcanzabilidad):
        self.mensajesRecibidos = mensajesRecibidos
        self.tablaAlcanzabilidad = tablaAlcanzabilidad

    def recibeMensajes(self, serverSocket):
        while 1:
            message, clientAddress = serverSocket.recvfrom(2048)
            mensaje = Mensaje(clientAddress[0], clientAddress[1], message)

            cantTuplas = int(codecs.encode(message[0:2], 'hex_codec'))
            mensajeSalir = int.from_bytes(message[2:3], byteorder='big')
            #Si el mensaje recibido es la palabra close se cierra la aplicacion
            if cantTuplas == 1 and len(message) == 3 and mensajeSalir == 0:
                print("Nodo aviso suicidio")
                self.tablaAlcanzabilidad.borrarFuenteDesdeAfuera(
                    clientAddress[0], clientAddress[1])
            else:
                self.mensajesRecibidos.guardarMensaje(mensaje)
                self.mensajesRecibidos.imprimirMensaje(mensaje)
                self.tablaAlcanzabilidad.actualizarTabla(mensaje)

    def procRecibeMsg(self, ip, puerto):
        #self.lockMensajesRecibidos.acquire()
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        serverSocket.bind((ip, puerto))
        self.recibeMensajes(serverSocket)
        #self.lockMensajesRecibidos.release()
class ReceptorUDP:
    mensajesRecibidos = MensajesRecibidos()
    tablaAlcanzabilidad = TablaAlcanzabilidad()

    def __init__(self, mensajesRecibidos, tablaAlcanzabilidad):
        self.mensajesRecibidos = mensajesRecibidos
        self.tablaAlcanzabilidad = tablaAlcanzabilidad

    def responderACK(self, serverSocket, clientAddress):
        print("aqui")
        if randrange(10) > 1:
            serverSocket.sendto((1).to_bytes(1, byteorder='big'),
                                (clientAddress[0], clientAddress[1]))
            print(clientAddress[0])
            print(clientAddress[1])
            #print(message)

    def recivir(self, serverSocket, numero):
        message, clientAddress = serverSocket.recvfrom(2048)
        self.responderACK(serverSocket, clientAddress)
        print(numero)
        print(message)

    def recibeMensajes(self, serverSocket):
        while 1:
            proceso_receptorUDP = threading.Thread(target=ReceptorUDP(
                None, None).recivir,
                                                   args=(
                                                       serverSocket,
                                                       1,
                                                   ))
            proceso_receptorUDP.start()

            proceso_receptorUDP = threading.Thread(target=ReceptorUDP(
                None, None).recivir,
                                                   args=(
                                                       serverSocket,
                                                       2,
                                                   ))
            proceso_receptorUDP.start()

            proceso_receptorUDP = threading.Thread(target=ReceptorUDP(
                None, None).recivir,
                                                   args=(
                                                       serverSocket,
                                                       3,
                                                   ))
            proceso_receptorUDP.start()

            message, clientAddress = serverSocket.recvfrom(2048)
            #proceso_receptorUDP = threading.Thread(target=self.responderACK, args=(serverSocket,clientAddress,))
            #proceso_receptorUDP.start()
            #print("imprimi")

    def procRecibeMsg(self, ip, puerto):
        #self.lockMensajesRecibidos.acquire()
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        serverSocket.bind((ip, puerto))
        self.recibeMensajes(serverSocket)
示例#3
0
    def iniciarNodoTCP(self, ip, puerto):

        mensajesRecibidos = MensajesRecibidos()
        tablaAlcanzabilidad = TablaAlcanzabilidad()

        repetorTcp = ReceptorTCP(mensajesRecibidos, tablaAlcanzabilidad)
        proceso_repetorTcp = threading.Thread(target=repetorTcp.recibir,
                                              args=(
                                                  ip,
                                                  puerto,
                                              ))
        proceso_repetorTcp.start()

        emisorTcp = EmisorTCP(mensajesRecibidos, tablaAlcanzabilidad)
        proceso_emisorTcp = threading.Thread(target=emisorTcp.menu, args=())
        proceso_emisorTcp.start()
示例#4
0
    def iniciarNodoUDP(self, ip, puerto):
        mensajesRecibidos = MensajesRecibidos()
        tablaAlcanzabilidad = TablaAlcanzabilidad()

        receptorUDP = ReceptorUDP(mensajesRecibidos, tablaAlcanzabilidad)
        proceso_receptorUDP = threading.Thread(
            target=receptorUDP.procRecibeMsg, args=(
                ip,
                puerto,
            ))
        proceso_receptorUDP.start()

        emisorUDP = EmisorUDP(mensajesRecibidos, tablaAlcanzabilidad)
        proceso_emisorUDP = threading.Thread(target=emisorUDP.despligueMenuUDP,
                                             args=())
        proceso_emisorUDP.start()
示例#5
0
class EmisorTCP:
    #Objeto para guardar conexiones
    conexiones = list()

    lockConexiones = threading.Lock()

    mensajesRecibidos = MensajesRecibidos()

    tablaAlcanzabilidad = TablaAlcanzabilidad()

    def __init__(self, mensajesRecibidos, tablaAlcanzabilidad):
        self.mensajesRecibidos = mensajesRecibidos
        self.tablaAlcanzabilidad = tablaAlcanzabilidad
        self.conexiones = list()
        self.lockConexiones = threading.Lock()

    #Llamar solo SIN candado adquirido
    def imprimirConexionesExistentes(self):
        self.lockConexiones.acquire()
        i = 0
        largo = len(self.conexiones)
        while i < largo:
            print(self.conexiones[i].ip + " " + str(self.conexiones[i].puerto))
            i = i + 1
        self.lockConexiones.release()

    #Llamar solo CON candado adquirido
    def hacerConexion(self, ip, puerto):
        #se crea el socket para enviar
        socketEmisorTCP = socket.socket()
        conexion = ConexionAbierta(ip, puerto, socketEmisorTCP)
        #Se establece la conexion con el receptorTCP mediante la ip y el puerto
        try:
            socketEmisorTCP.connect((ip, puerto))
        except SocketError:
            print("Fallo de conexion")
            return False
        else:
            print("Conexion establecida")
            self.conexiones.append(conexion)
            return True

    #Llamar solo CON candado adquirido
    def buscarConexion(self, ip, puerto):
        i = 0
        largo = len(self.conexiones)
        while i < largo:
            if self.conexiones[i].soyLaConexion(ip, puerto):
                return i
            i = i + 1
        return -1

    #Llamar solo CON candado adquirido
    def cerrarUnaConexion(self, ip, puerto):
        i = 0
        largo = len(self.conexiones)
        while i < largo:
            if self.conexiones[i].soyLaConexion(ip, puerto):
                self.conexiones[i].cerrarConexion()
                self.conexiones.remove(self.conexiones[i])
                break
            i = i + 1

    #Llamar solo CON candado adquirido
    def cerrarConexiones(self):
        while len(self.conexiones) != 0:
            self.conexiones[0].cerrarConexion()
            self.conexiones.remove(self.conexiones[0])

    #NO necesita tener candado
    def tuplaToBytes(self, tupla):
        tupladiv = tupla.split(' ')
        numeroip = tupladiv[0]
        myip = numeroip.split('.')
        bytesmios = bytearray()
        for x in range(0, 4):
            ipnum = int(myip[x])
            bytesmios += (ipnum).to_bytes(1, byteorder='big')
        masc = int(tupladiv[1])
        bytesmios += (masc).to_bytes(1, byteorder='big')
        costo = int(tupladiv[2])
        bytesmios += (costo).to_bytes(3, byteorder='big')
        return bytesmios

    #NO necesita tener candado
    def leerMensaje(self):
        #print('Ingrese la cantidad de tuplas que quiere enviar:')
        entradas = 0
        leerCantTuplas = True
        while leerCantTuplas:
            lectura = input("Ingrese la cantidad de tuplas: ")
            try:
                entradas = int(lectura)
                leerCantTuplas = False
            except ValueError as e:
                print("Cantidad de tuplas invalido")
                leerCantTuplas = True

        vectorBytes = bytearray((entradas).to_bytes(2, byteorder='big'))
        i = 0

        while i < entradas:
            #print('Ingrese la tupla:')
            leer = True
            while leer:
                tupla = input("Ingrese una tupla(ip mascara costo): ")
                tuplaDividida = tupla.split()  # tupla.replace(" ", "/",1)
                if len(tuplaDividida) == 3:
                    ipPrueba = tuplaDividida[0] + "/" + tuplaDividida[1]
                    try:
                        n = ipaddress.ip_network(ipPrueba)
                    except ValueError as e:
                        print("Ip o mascara no valida")
                        leer = True
                    else:
                        leer = False
                        try:
                            costo = int(tuplaDividida[2])
                        except ValueError as e:
                            print("Costo no valido")
                            leer = True
                        else:
                            if costo > 0 and costo < 65536:
                                leer = False
                            else:
                                print("Costo no valido")
                                leer = True
                else:
                    print("Faltan valores")

            vectorBytes += self.tuplaToBytes(tupla)
            i = i + 1
            #print('\n')
        return vectorBytes

    #Llamar solo SIN candado adquirido
    def enviarMensaje(self):
        #self.lockConexiones.acquire()
        ip = input("Digite la ip del destinatario: ")
        ipPrueba = ip + "/32"
        try:
            n = ipaddress.ip_network(ipPrueba)
        except ValueError as e:
            print("Ip no valida")
        else:
            puerto = input("Digite el puerto del destinatario: ")
            try:
                n = int(puerto)
            except ValueError as e:
                print("Puerto no valido")
            else:
                if n < 0 or n > 65535:
                    print("Puerto no valido")
                else:
                    self.lockConexiones.acquire()
                    indice = self.buscarConexion(ip, int(puerto))

                    if indice == -1:
                        exito = self.hacerConexion(ip, int(puerto))
                        if exito:
                            print("Nueva conexion")
                            mensaje = self.leerMensaje()
                            respEnvio = self.conexiones[len(self.conexiones) -
                                                        1].enviarMensaje(
                                                            mensaje)
                            if respEnvio == False:
                                self.cerrarUnaConexion(ip, int(puerto))
                            if len(mensaje) == 3:
                                self.conexiones.pop(len(self.conexiones) - 1)
                    else:
                        print("Conexion existente")
                        mensaje = self.leerMensaje()
                        respEnvio = self.conexiones[indice].enviarMensaje(
                            mensaje)
                        if respEnvio == False:
                            self.cerrarUnaConexion(ip, int(puerto))
                        if len(mensaje) == 3:
                            self.conexiones.pop(indice)
                    self.lockConexiones.release()

    #Llamar solo SIN candado adquirido
    def borrarme(self):
        #self.lockConexiones.acquire()
        mensaje = bytearray((1).to_bytes(2, byteorder='big'))  # cant tuplas
        mensaje += (0).to_bytes(1, byteorder='big')

        i = 0
        self.lockConexiones.acquire()
        cant = len(self.conexiones)
        while i < cant:
            self.conexiones[i].enviarMensaje(mensaje)
            i = i + 1
        self.cerrarConexiones()
        self.lockConexiones.release()
        return

    #NO necesita tener candado
    def menu(self):

        bandera = True
        while bandera == True:
            print('Menu principal del modulo de Red TCP: \n'
                  '\t1. Enviar un mensaje. \n'
                  '\t2. Ver mensajes recibidos. \n'
                  '\t3. Imprimir tabla de alcanzabilidad. \n'
                  '\t4. Conexiones existentes. \n'
                  '\t5. Cerrar nodo.')
            taskUsuario = input('Que desea hacer:')
            if taskUsuario == '1':
                self.enviarMensaje()
            elif taskUsuario == '2':
                print("\n\n")
                print('Mensajes recibidos:')
                self.mensajesRecibidos.imprimirMensajes()
                print("\n\n")
            elif taskUsuario == '3':
                print("\n\n")
                print('Tabla de alcanzabilidad:')
                self.tablaAlcanzabilidad.imprimirTabla()
                print("\n\n")
            elif taskUsuario == '5':
                bandera = False
                self.borrarme()
                print('Salida.')
                os._exit(1)
                #proceso_repetorTcp.exit()
            elif taskUsuario == '4':
                print("Conexiones existentes:")
                self.imprimirConexionesExistentes()
            else:
                print('Ingrese una opcion valida.')
示例#6
0
class EmisorUDP:
	#Objeto para guardar conexiones
	mensajesRecibidos = MensajesRecibidos()
	tablaAlcanzabilidad = TablaAlcanzabilidad()

	def __init__(self,mensajesRecibidos, tablaAlcanzabilidad):
		self.mensajesRecibidos = mensajesRecibidos
		self.tablaAlcanzabilidad = tablaAlcanzabilidad
		
	def tuplaToBytes(self,tupla):
		tupladiv = tupla.split(' ')
		numeroip = tupladiv[0]
		myip = numeroip.split('.')
		bytesmios = bytearray()
		for x in range(0, 4):
			ipnum = int(myip[x])
			bytesmios += (ipnum).to_bytes(1, byteorder='big')
		masc = int(tupladiv[1])
		bytesmios += (masc).to_bytes(1, byteorder='big')
		costo = int(tupladiv[2])
		bytesmios += (costo).to_bytes(3, byteorder='big')
		return bytesmios
	def leerMensaje(self):
		#print('Ingrese la cantidad de tuplas que quiere enviar:')
		entradas = 0
		leerCantTuplas = True
		while leerCantTuplas:
			lectura = input( "Ingrese la cantidad de tuplas: " )
			try:
				entradas = int(lectura)
				leerCantTuplas = False
			except ValueError as e:
				print("Cantidad de tuplas invalido")
				leerCantTuplas = True
		
		vectorBytes = bytearray((entradas).to_bytes(2, byteorder='big'))
		i = 0
		
		while i < entradas:
			#print('Ingrese la tupla:')
			leer = True
			while leer:
				tupla = input("Ingrese una tupla(ip mascara costo): ")
				tuplaDividida = tupla.split()# tupla.replace(" ", "/",1)
				if len(tuplaDividida) == 3 :
					ipPrueba = tuplaDividida[0] + "/" + tuplaDividida[1]
					try:
						n = ipaddress.ip_network(ipPrueba) 
					except ValueError as e:
						print ("Ip o mascara no valida")
						leer = True
					else:
						leer = False
						try:
							costo = int(tuplaDividida[2]) 
						except ValueError as e:
							print ("Costo no valido")
							leer = True
						else:
							if costo > 0 and costo < 65536:
								leer = False
							else:
								print ("Costo no valido")
								leer = True
				else:
					print ("Faltan valores")

			vectorBytes += self.tuplaToBytes(tupla)
			i = i + 1
			#print('\n')
		return vectorBytes

	def envioMensajeUDP(self):
		serverNameS = input('Digite la ip del destinatario: ')
		ipPrueba = serverNameS + "/32"
		try:
			n = ipaddress.ip_network(ipPrueba)
		except ValueError as e:
			print ("Ip no valida")
		else:
			lecturaPuerto = input('Digite el puerto del destinatario: ')
			try:
				serverPortS = int(lecturaPuerto)
			except ValueError as e:
				print ("Puerto no valido")
			else:
				if serverPortS < 0 or serverPortS > 65535:
					print ("Puerto no valido")
				else:
					message = self.leerMensaje()
					clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
					clientSocket.sendto(message, (serverNameS, serverPortS))
					clientSocket.close()

	def borrarme(self):
		mensaje = bytearray((1).to_bytes(2, byteorder='big'))# cant tuplas
		mensaje += (0).to_bytes(1, byteorder='big')
		fuente = self.tablaAlcanzabilidad.eliminarPrimerFuente()
		#print("Elimine la primer fuente")
		print ("llegue aqui")
		while fuente.puertoFuente != 0:
			clientSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
			clientSocket.sendto(mensaje, (fuente.ipFuente, fuente.puertoFuente))
			clientSocket.close()
			fuente = self.tablaAlcanzabilidad.eliminarPrimerFuente()

	def despligueMenuUDP(self):

		bandera = True
		while bandera == True:
			print('Menu principal del modulo de Red UDP: \n'
					'\t1. Enviar un mensaje. \n'
					'\t2. Ver mensajes recibidos. \n'
					'\t3. Imprimir tabla de alcanzabilidad.\n'
					'\t4. Cerrar servidor de mensajes.')
			taskUsuario = input('Que desea hacer:')
			if taskUsuario == '1':
				self.envioMensajeUDP()
			elif taskUsuario == '2':
				print("\n\n")
				print('Mensajes recibidos:')
				self.mensajesRecibidos.imprimirMensajes()
				print("\n\n")
			elif taskUsuario == '3':
				print("\n\n")
				print('Tabla de alcanzabilidad:')
				self.tablaAlcanzabilidad.imprimirTabla()
				print("\n\n")
			elif taskUsuario == '4':
				bandera = False
				self.borrarme()
				print('Salida.')
				os._exit(1)

			else:
				print('Ingrese opcion valida.')
示例#7
0
class ReceptorTCP:
    mensajesRecibidos = MensajesRecibidos()
    tablaAlcanzabilidad = TablaAlcanzabilidad()

    def __init__(self, mensajesRecibidos, tablaAlcanzabilidad):
        self.mensajesRecibidos = mensajesRecibidos
        self.tablaAlcanzabilidad = tablaAlcanzabilidad

    def establecerConexion(self, conexion, addr):
        while True:
            #Recibimos el mensaje, con el metodo recv recibimos datos y como parametro
            #la cantidad de bytes para recibir
            try:
                recibido = conexion.recv(2048)
            except SocketError:
                print("Conexion Perdida")
                self.tablaAlcanzabilidad.borrarFuenteDesdeAfuera(
                    addr[0], addr[1])
                break

            if (
                    recibido == b''
            ):  #Salida para cuando el otro muere antes de mandar el primer mensaje
                print("Conexion Perdida")
                self.tablaAlcanzabilidad.borrarFuenteDesdeAfuera(
                    addr[0], addr[1])
                break

            cantTuplas = int(codecs.encode(recibido[0:2], 'hex_codec'))
            #mensajeSalir = int.from_bytes( recibido[2:3], byteorder='big' )
            #Si el mensaje recibido es la palabra close se cierra la aplicacion
            if cantTuplas == 1 and len(recibido) == 3:
                print("Conexion Terminada")
                self.tablaAlcanzabilidad.borrarFuenteDesdeAfuera(
                    addr[0], addr[1])
                break

            mensaje = Mensaje(addr[0], addr[1], recibido)
            self.mensajesRecibidos.guardarMensaje(mensaje)
            self.mensajesRecibidos.imprimirMensaje(mensaje)
            self.tablaAlcanzabilidad.actualizarTabla(mensaje)

        conexion.close()

    def recibir(self, ip, puerto):
        #instanciamos un objeto para trabajar con el socket
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        s.bind((ip, puerto))

        s.listen(5)

        while True:
            conexion, addr = s.accept()

            thread_servidor = threading.Thread(target=self.establecerConexion,
                                               args=(conexion, addr))
            thread_servidor.start()
            print("Conexion recibida")

        #Cerramos la instancia del socket cliente y servidor
        s.close()
示例#8
0
class ReceptorUDP:
    mensajesRecibidos = MensajesRecibidos()
    tablaAlcanzabilidad = TablaAlcanzabilidad()

    def __init__(self, mensajesRecibidos, tablaAlcanzabilidad):
        self.mensajesRecibidos = mensajesRecibidos
        self.tablaAlcanzabilidad = tablaAlcanzabilidad

    def recibeMensajes(self, serverSocket):
        while 1:
            message, clientAddress = serverSocket.recvfrom(2048)
            mensaje = Mensaje(clientAddress[0], clientAddress[1], message)

            cantTuplas = int(codecs.encode(message[0:2], 'hex_codec'))
            mensajeSalir = int.from_bytes(message[2:3], byteorder='big')
            #Si el mensaje recibido es la palabra close se cierra la aplicacion
            if cantTuplas == 1 and len(message) == 3 and mensajeSalir == 0:
                print("Nodo aviso suicidio")
                self.tablaAlcanzabilidad.borrarFuenteDesdeAfuera(
                    clientAddress[0], clientAddress[1])
            else:
                self.mensajesRecibidos.guardarMensaje(mensaje)
                self.mensajesRecibidos.imprimirMensaje(mensaje)
                self.tablaAlcanzabilidad.actualizarTabla(mensaje)

    def procRecibeMsg(self, ip, puerto):
        #self.lockMensajesRecibidos.acquire()
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        serverSocket.bind((ip, puerto))
        self.recibeMensajes(serverSocket)
        #self.lockMensajesRecibidos.release()

    def tuplaToBytes(self, tupla):
        tupladiv = tupla.split(' ')
        numeroip = tupladiv[0]
        myip = numeroip.split('.')
        bytesmios = bytearray()
        for x in range(0, 4):
            ipnum = int(myip[x])
            bytesmios += (ipnum).to_bytes(1, byteorder='big')
        masc = int(tupladiv[1])
        bytesmios += (masc).to_bytes(1, byteorder='big')
        costo = int(tupladiv[2])
        bytesmios += (costo).to_bytes(3, byteorder='big')
        return bytesmios

    def leerMensaje(self):
        #print('Ingrese la cantidad de tuplas que quiere enviar:')
        entradas = 0
        leerCantTuplas = True
        while leerCantTuplas:
            lectura = input("Ingrese la cantidad de tuplas: ")
            try:
                entradas = int(lectura)
                leerCantTuplas = False
            except ValueError as e:
                print("Cantidad de tuplas invalido")
                leerCantTuplas = True

        vectorBytes = bytearray((entradas).to_bytes(2, byteorder='big'))
        i = 0

        while i < entradas:
            #print('Ingrese la tupla:')
            leer = True
            while leer:
                tupla = input("Ingrese una tupla(ip mascara puerto): ")
                tuplaDividida = tupla.split()  # tupla.replace(" ", "/",1)
                if len(tuplaDividida) == 3:
                    ipPrueba = tuplaDividida[0] + "/" + tuplaDividida[1]
                    try:
                        n = ipaddress.ip_network(ipPrueba)
                    except ValueError as e:
                        print("Ip o mascara no valida")
                        leer = True
                    else:
                        leer = False
                        try:
                            costo = int(tuplaDividida[2])
                        except ValueError as e:
                            print("Costo no valido")
                            leer = True
                        else:
                            if costo > 0 and costo < 65536:
                                leer = False
                            else:
                                print("Costo no valido")
                                leer = True
                else:
                    print("Faltan valores")

            vectorBytes += self.tuplaToBytes(tupla)
            i = i + 1
            #print('\n')
        return vectorBytes
示例#9
0
class ReceptorUDP:
    mensajesRecibidos = MensajesRecibidos()
    tablaAlcanzabilidad = TablaAlcanzabilidad()

    conexiones = list()
    lockConexiones = threading.Lock()

    posiblesConexiones = list()
    lockPosiblesConexiones = threading.Lock()

    def __init__(self, mensajesRecibidos, tablaAlcanzabilidad):
        self.mensajesRecibidos = mensajesRecibidos
        self.tablaAlcanzabilidad = tablaAlcanzabilidad
        self.conexiones = list(
        )  #DEBE ENTRAR POR PARAMETRO EN CASO DE QUE LAS CONEXIONES LAS TENGAN EMISOR Y RECEPTOR
        self.lockConexiones = threading.Lock(
        )  #DEBE ENTRAR POR PARAMETRO EN CASO DE QUE LAS CONEXIONES LAS TENGAN EMISOR Y RECEPTOR
        self.posiblesConexiones = list()
        self.lockPosiblesConexiones = threading.Lock()

    #Llamar solo SIN candado adquirido
    def imprimirConexionesLogicas(self):
        self.lockConexiones.acquire()
        i = 0
        largo = len(self.conexiones)
        while i < largo:
            print(self.conexiones[i].ip + " " + str(self.conexiones[i].puerto))
            i = i + 1
        self.lockConexiones.release()

    #Llamar solo CON candado adquirido
    def buscarConexionLogica(
        self, ip, puerto
    ):  #APLICA SI LAS CONEXIONES DEBEN ESTAR PARA AMBOS , creo que deben estar aunque para tener una lista de las conexiones hechas para usarlas, VER QUE DICE LA PROFE
        i = 0
        largo = len(self.conexiones)
        while i < largo:
            if self.conexiones[i].soyLaConexionHacia(ip, puerto):
                return i
            i = i + 1
        return -1

    #Llamar solo CON candado adquirido
    def buscarPosibleConexionLogica(
        self, ip, puerto
    ):  #APLICA SI LAS CONEXIONES DEBEN ESTAR PARA AMBOS , creo que deben estar aunque para tener una lista de las conexiones hechas para usarlas, VER QUE DICE LA PROFE
        i = 0
        largo = len(self.posiblesConexiones)
        while i < largo:
            if self.posiblesConexiones[i].soyLaConexionHacia(ip, puerto):
                return i
            i = i + 1
        return -1

    def accept(self, serverSocket, emisor, recibido):
        #Establecer RN = 0, poner en la estructura de la conexion un buffer y este RN

        otroIpRec = bytesToIp(recibido[0:4])
        print(otroIpRec)
        otroPuertoRec = bytesToInt(recibido[4:6])
        print(otroPuertoRec)
        miIpRec = bytesToIp(recibido[6:10])
        print(miIpRec)
        miPuertoRec = bytesToInt(recibido[10:12])
        print(miPuertoRec)
        tipoPaq = bytesToInt(recibido[12:13])
        secuencia = bytesToInt(
            recibido[13:14])  #OJO SI SE CAMBIA A MAS GRANDE AL SECUENCIA

        #ver si  hay que verificar que la conexion no exista
        conexionNueva = ConexionLogicaUDP(otroIpRec, otroPuertoRec, miIpRec,
                                          miPuertoRec)

        mensaje = armarPaq(miIpRec, miPuertoRec, otroIpRec, otroPuertoRec, 5,
                           0, bytearray())

        serverSocket.sendto(mensaje, (emisor[0], emisor[1]))
        #SE METE A UNA LISTA DE POSIBLES COENXIONES

        self.lockPosiblesConexiones.acquire()

        self.posiblesConexiones.append(conexionNueva)

        self.lockPosiblesConexiones.release()

    def finalaccept(self, recibido):
        otroIpRec = bytesToIp(recibido[0:4])
        otroPuertoRec = bytesToInt(recibido[4:6])
        miIpRec = bytesToIp(recibido[6:10])
        miPuertoRec = bytesToInt(recibido[10:12])
        tipoPaq = bytesToInt(recibido[12:13])
        secuencia = bytesToInt(
            recibido[13:14])  #OJO SI SE CAMBIA A MAS GRANDE AL SECUENCIA

        self.lockPosiblesConexiones.acquire()

        indice = self.buscarPosibleConexionLogica(otroIpRec, otroPuertoRec)

        if indice == -1:
            print("Llego un finSyn sin que exista un syn")
        else:
            conexionestablecida = self.posiblesConexiones.pop(indice)
            self.lockConexiones.acquire()
            self.conexiones.append(conexionestablecida)
            self.lockConexiones.release()
            print("Conexion Establecida")

        self.lockPosiblesConexiones.release()

    #Algoritmo ARQRECEPTOR
    def paqueteConDatos(self, emisor, recibido):
        otroIpRec = bytesToIp(recibido[0:4])
        #print(otroIpRec)
        otroPuertoRec = bytesToInt(recibido[4:6])
        #print(otroPuertoRec)
        miIpRec = bytesToIp(recibido[6:10])
        #print(miIpRec)
        miPuertoRec = bytesToInt(recibido[10:12])
        #print(miPuertoRec)
        tipoPaq = bytesToInt(recibido[12:13])
        secuencia = bytesToInt(recibido[13:14])
        datos = recibido[13:]

        self.lockConexiones.acquire()
        indice = self.buscarConexionLogica(otroIpRec, otroPuertoRec)

        if indice == -1:
            print("Paquete de conexion no establecida")
        else:
            print("Mande a porocesar")
            self.conexiones[indice].recv(emisor, recibido)
        self.lockConexiones.release()

    def listen(self, ip, puerto):
        #self.lockMensajesRecibidos.acquire()
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        serverSocket.bind((ip, puerto))

        while 1:  #CREAR UN HILO PARA QUE PROCESE CADA MENSAJE RECIBIDO
            mensaje, addr = serverSocket.recvfrom(2048)
            if bytesToInt(
                    mensaje[12:13]) == 1:  # Mensaje para establecer conexion
                self.accept(serverSocket, addr, mensaje)
            elif bytesToInt(
                    mensaje[12:13]
            ) == 6:  # Mensaje ack de establecer conexion(fin de establecimiento de conexion)
                self.finalaccept(mensaje)
            elif bytesToInt(mensaje[12:13]) == 16:  # Mensaje de datos
                if randrange(10) > 1:
                    self.paqueteConDatos(addr, mensaje)
示例#10
0
        self.lockConexiones.release()

    def listen(self, ip, puerto):
        #self.lockMensajesRecibidos.acquire()
        serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        serverSocket.bind((ip, puerto))

        while 1:  #CREAR UN HILO PARA QUE PROCESE CADA MENSAJE RECIBIDO
            mensaje, addr = serverSocket.recvfrom(2048)
            if bytesToInt(
                    mensaje[12:13]) == 1:  # Mensaje para establecer conexion
                self.accept(serverSocket, addr, mensaje)
            elif bytesToInt(
                    mensaje[12:13]
            ) == 6:  # Mensaje ack de establecer conexion(fin de establecimiento de conexion)
                self.finalaccept(mensaje)
            elif bytesToInt(mensaje[12:13]) == 16:  # Mensaje de datos
                if randrange(10) > 1:
                    self.paqueteConDatos(addr, mensaje)


if __name__ == '__main__':
    mensajesRecibidos = MensajesRecibidos()
    tablaAlcanzabilidad = TablaAlcanzabilidad()
    servidorUDP = ReceptorUDP(mensajesRecibidos, tablaAlcanzabilidad)
    proceso_receptorUDP = threading.Thread(target=servidorUDP.listen,
                                           args=(
                                               "172.16.105.251",
                                               5000,
                                           ))
    proceso_receptorUDP.start()