def forwardPacket(self):
     while True:
         req = self.forwardingQueue.get()
         params = req["params"]
         segment = req["segment"]
         if params["next"] in self.forwardingCache:
             if time.time() - self.forwardingCache[params["next"]]["time"] < conf["cache_update_limit"]:
                 reply = self.forwardingCache[params["next"]]
                 reply.update({"next": params["next"]})
             else:
                 print "Expired, Updating cache", params, self.id
                 client = helper.rpc_client()
                 reply = json.loads(client.call("GET ROUTE" + json.dumps({"start": self.id, "end": params["end"]})))
                 self.forwardingCache.update(
                     {
                         reply["next"]: {
                             "time": time.time(),
                             "server_ip": reply["server_ip"],
                             "server_port": reply["server_port"],
                         }
                     }
                 )
         else:
             print "Not in cache", params, self.id
             client = helper.rpc_client()
             reply = json.loads(client.call("GET ROUTE" + json.dumps({"start": self.id, "end": params["end"]})))
             self.forwardingCache.update(
                 {
                     params["next"]: {
                         "time": time.time(),
                         "server_ip": reply["server_ip"],
                         "server_port": reply["server_port"],
                     }
                 }
             )
         self.transferingFd.sendto(
             "FWRD DATA"
             + json.dumps({"start": params["start"], "next": reply["next"], "end": params["end"]})
             + segment,
             (reply["server_ip"], reply["server_port"]),
         )
         ack_Data, ack_addr = self.transferingFd.recvfrom(MAX_SIZE)
	def forwardPacket(self) :
		while True :
			req = self.forwardingQueue.get()			
			params = req['params']
			segment = req['segment']
			if params['next'] in self.forwardingCache :
				if time.time() - self.forwardingCache[params['next']]['time'] < conf['cache_update_limit'] :				
					reply = self.forwardingCache[params['next']]
					reply.update({'next':params['next']})
				else :
					print 'Expired, Updating cache' , params , self.id
					client = helper.rpc_client()
					reply = json.loads(client.call('GET ROUTE' + json.dumps({'start':self.id,'end':params['end']})))
					self.forwardingCache.update({reply['next']:{'time':time.time(),'server_ip':reply['server_ip'],'server_port':reply['server_port']}})
			else :
				print 'Not in cache' , params , self.id
				client = helper.rpc_client()
				reply = json.loads(client.call('GET ROUTE' + json.dumps({'start':self.id,'end':params['end']})))
				self.forwardingCache.update({params['next']:{'time':time.time(),'server_ip':reply['server_ip'],'server_port':reply['server_port']}})
			self.transferingFd.sendto('FWRD DATA' + json.dumps({'start':params['start'],'next':reply['next'],'end':params['end']}) + segment,(reply['server_ip'],reply['server_port']))		
			ack_Data , ack_addr = self.transferingFd.recvfrom(MAX_SIZE)			
	def __init__(self,Id) :
		self.id = Id
		self.bindNodeServer()
		self.forwardingCache = {}
		self.forwardingQueue = Queue.Queue()
		self.incompleteData = {}
		self.openFds = {}		
		client = helper.rpc_client()
		client_fd = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
		client_fd.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
		self.transferingFd = client_fd
		response =  client.call('SRV UPDTE'+json.dumps({'ip':self.server_ip,'port':self.server_port,'id':self.id}))
		threading.Thread(target=self.nodeParameterUpdateRequest,args=()).start()
		threading.Thread(target=self.forwardPacket,args=()).start()
	def transferData(self,end,file_path) :
		FILE = file_path.split('/')[-1]
		with open(file_path,'rb') as f :
			data = f.read()
		time_Stamp = helper.md5(time.time())[:6] + helper.md5(data[:100])[:6]		
		client = helper.rpc_client()
		reply = json.loads(client.call('GET ROUTE' + json.dumps({'start':self.id,'end':end})))
		packets_seq = [ '!_$@$_!' + FILE + '!_$@$_!' +  str(i) + '!_$@$_!' + time_Stamp + '!_$@$_!' for i in range((len(data)/MAX_DATA_SIZE)+1)] 
		client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
		count = 00
		for item in packets_seq :
			client.sendto('FWRD DATA' + json.dumps({'next':reply['next'],'start':self.id,'end':end}) + '!_$@damei@$_!' + FILE + '!_$@damei@$_!' +  str(count) + '!_$@damei@$_!' + time_Stamp + '!_$@damei@$_!' + data[(count)*MAX_DATA_SIZE:(count+1)*MAX_DATA_SIZE],(reply['server_ip'],reply['server_port']))
			ack_data , ack_addr = client.recvfrom(MAX_DATA_SIZE)
			count += 1	
		client.sendto('FWRD DATA' + json.dumps({'next':reply['next'],'start':self.id,'end':end}) + '!_$@damei@$_!' + FILE + '!_$@damei@$_!ENDENDEND!_$@damei@$_!' + time_Stamp + '!_$@damei@$_!',(reply['server_ip'],reply['server_port']))
		ack_data , ack_addr = client.recvfrom(MAX_DATA_SIZE)
 def __init__(self, Id):
     self.id = Id
     self.bindNodeServer()
     self.forwardingCache = {}
     self.forwardingQueue = Queue.Queue()
     self.incompleteData = {}
     self.openFds = {}
     client = helper.rpc_client()
     client_fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     client_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     self.transferingFd = client_fd
     response = client.call(
         "SRV UPDTE" + json.dumps({"ip": self.server_ip, "port": self.server_port, "id": self.id})
     )
     threading.Thread(target=self.nodeParameterUpdateRequest, args=()).start()
     threading.Thread(target=self.forwardPacket, args=()).start()
 def transferData(self, end, file_path):
     FILE = file_path.split("/")[-1]
     with open(file_path, "rb") as f:
         data = f.read()
     time_Stamp = helper.md5(time.time())[:6] + helper.md5(data[:100])[:6]
     client = helper.rpc_client()
     reply = json.loads(client.call("GET ROUTE" + json.dumps({"start": self.id, "end": end})))
     packets_seq = [
         "!_$@$_!" + FILE + "!_$@$_!" + str(i) + "!_$@$_!" + time_Stamp + "!_$@$_!"
         for i in range((len(data) / MAX_DATA_SIZE) + 1)
     ]
     client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     count = 00
     for item in packets_seq:
         client.sendto(
             "FWRD DATA"
             + json.dumps({"next": reply["next"], "start": self.id, "end": end})
             + "!_$@damei@$_!"
             + FILE
             + "!_$@damei@$_!"
             + str(count)
             + "!_$@damei@$_!"
             + time_Stamp
             + "!_$@damei@$_!"
             + data[(count) * MAX_DATA_SIZE : (count + 1) * MAX_DATA_SIZE],
             (reply["server_ip"], reply["server_port"]),
         )
         ack_data, ack_addr = client.recvfrom(MAX_DATA_SIZE)
         count += 1
     client.sendto(
         "FWRD DATA"
         + json.dumps({"next": reply["next"], "start": self.id, "end": end})
         + "!_$@damei@$_!"
         + FILE
         + "!_$@damei@$_!ENDENDEND!_$@damei@$_!"
         + time_Stamp
         + "!_$@damei@$_!",
         (reply["server_ip"], reply["server_port"]),
     )
     ack_data, ack_addr = client.recvfrom(MAX_DATA_SIZE)