def __init__(self, index, port, shared_clock):
        super().__init__()
        self.index = index
        self.port = int(port)
        self.shared_clock = shared_clock
        self.running = False
        self.socket = create_socket(1.0, self.port)

        self.logger = setup_logger(self.index)
    def send_message(self, index, node):
        node_addr = (node["host"], node["port"])
        clock = self.clock.get()
        sock = create_socket()
        callback_port = bind_random_port(sock)

        sock.sendto(
            f"{self.index} {clock} {self.host} {callback_port}".encode("utf-8"),
            node_addr,
        )
        wait_response(sock, node_addr, 3.0)

        sock.close()

        self.logger.info(f"""{perf_counter_ns() // 1000} {self.index} {clock}{self.index} s {index}""")
	def test_local_socket(self):
		import network

		try:
			a = network.create_socket()
			self.assertFalse(a == None) #Socket Creation Failed - Connection Refused
			b = network.create_socket()
			self.assertFalse(b == None)
			
			b.bind( ("0.0.0.0",25565) )
			a.sendto("Passed",("localhost",25565))
			data = b.recvfrom(4096)[0]
			
			log.debug("Packet test: "+ data)
			
			self.assertEqual(data,"Passed")
		except network.socket.error:
			self.assertTrue(False) #Socket creation failed - Exception Raised
		
		#close the socket - not part of the test
		try:
			a.close()
		except:
			pass
def login(fname, lname, anumber, alias, endpoint, label=None):
	
	if label==None: label=alias
	
	id = packet.ID()

	id.fname = fname
	id.lname = lname
	id.alias = alias
	id.anumber = anumber
	
	session = Session()
	
	#only ipv4 for now. Splits port from IP
	(address, port) = endpoint.split(":")
	port = eval(port)
	
	session.registry = (address,port)
	
	session.id = id
	while session.socket == None:
		session.socket = network.create_socket()
	
	log.info("Logging in")
	
	#While we're still waiting on a login reply, keep listening
	status = 0
	while(session.login == False):
		network.send( session, packet.login_request(session.id, label) )
		time.sleep(1)
		data = network.receive(session)
		if data==None: continue

		if(data["__type"] == "LoginReply:#Messages.ReplyMessages"):
			if(data["Success"]):
				log.info("Login succeeded")
				session.procinfo = data["ProcessInfo"]
				session.login = True
			else:
				log.error("Login failed")
				log.error("Error message was: "+ data["Note"])
				return session
		else:
			log.warning("Unexpected packet received: " + str(data) )

	return session