def handle(self): self.data = self.request.recv(1024) hello = tcp_node_msgs_pb2.TCPHello() try: hello.ParseFromString(self.data[3:-4]) except: return # send packet containing UDP server (127.0.0.1) # (very little investigation done into this packet while creating # protobuf structures hence the excessive "details" usage) msg = tcp_node_msgs_pb2.TCPServerInfo() msg.player_id = hello.player_id msg.f3 = 0 servers = msg.servers.add() if self.request.getpeername( )[0] == '127.0.0.1': # to avoid needing hairpinning udp_node_ip = "127.0.0.1" elif os.path.exists(SERVER_IP_FILE): with open(SERVER_IP_FILE, 'r') as f: udp_node_ip = f.read().rstrip('\r\n') else: udp_node_ip = "127.0.0.1" details1 = servers.details.add() details1.f1 = 1 details1.f2 = 6 details1.ip = udp_node_ip details1.port = 3022 details2 = servers.details.add() details2.f1 = 0 details2.f2 = 0 details2.ip = udp_node_ip details2.port = 3022 servers.f2 = 10 servers.f3 = 30 servers.f4 = 3 other_servers = msg.other_servers.add() wdetails1 = other_servers.details_wrapper.add() wdetails1.f1 = 1 wdetails1.f2 = 6 details3 = wdetails1.details.add() details3.CopyFrom(details1) wdetails2 = other_servers.details_wrapper.add() wdetails2.f1 = 0 wdetails2.f2 = 0 details4 = wdetails2.details.add() details4.CopyFrom(details2) other_servers.port = 3022 payload = msg.SerializeToString() # Send size of payload as 2 bytes self.request.sendall(struct.pack('!h', len(payload))) self.request.sendall(payload) player_id = hello.player_id msg = tcp_node_msgs_pb2.RecurringTCPResponse() msg.player_id = player_id msg.f3 = 0 msg.f11 = 1 payload = msg.SerializeToString() last_alive_check = int(zwift_offline.get_utc_time()) while True: #Check every 5 seconds for new updates tcpthreadevent.wait(timeout=5) try: message = udp_node_msgs_pb2.ServerToClient() message.f1 = 1 message.player_id = player_id message.world_time = zwift_offline.world_time() #PlayerUpdate if player_id in player_update_queue and len( player_update_queue[player_id] ) > 0 and player_id in online: added_player_updates = list() for player_update_proto in player_update_queue[player_id]: player_update = message.updates.add() player_update.ParseFromString(player_update_proto) #Send if 10 updates has already been added and start a new message if len(message.updates) > 9: message_payload = message.SerializeToString() self.request.sendall( struct.pack('!h', len(message_payload))) self.request.sendall(message_payload) message = udp_node_msgs_pb2.ServerToClient() message.f1 = 1 message.player_id = player_id message.world_time = zwift_offline.world_time() added_player_updates.append(player_update_proto) for player_update_proto in added_player_updates: player_update_queue[player_id].remove( player_update_proto) t = int(zwift_offline.get_utc_time()) #Check if any updates are added and should be sent to client, otherwise just keep alive every 25 seconds if len(message.updates) > 0: last_alive_check = t message_payload = message.SerializeToString() self.request.sendall( struct.pack('!h', len(message_payload))) self.request.sendall(message_payload) elif last_alive_check < t - 25: last_alive_check = t self.request.sendall(struct.pack('!h', len(payload))) self.request.sendall(payload) except: break
def handle(self): self.data = self.request.recv(1024) hello = tcp_node_msgs_pb2.TCPHello() try: hello.ParseFromString(self.data[3:-4]) except: return # send packet containing UDP server (127.0.0.1) # (very little investigation done into this packet while creating # protobuf structures hence the excessive "details" usage) msg = tcp_node_msgs_pb2.TCPServerInfo() msg.player_id = hello.player_id msg.f3 = 0 servers = msg.servers.add() if os.path.exists(SERVER_IP_FILE): with open(SERVER_IP_FILE, 'r') as f: udp_node_ip = f.read().rstrip('\r\n') else: udp_node_ip = "127.0.0.1" details1 = servers.details.add() details1.f1 = 1 details1.f2 = 6 details1.ip = udp_node_ip details1.port = 3022 details2 = servers.details.add() details2.f1 = 0 details2.f2 = 0 details2.ip = udp_node_ip details2.port = 3022 servers.f2 = 10 servers.f3 = 30 servers.f4 = 3 other_servers = msg.other_servers.add() wdetails1 = other_servers.details_wrapper.add() wdetails1.f1 = 1 wdetails1.f2 = 6 details3 = wdetails1.details.add() details3.CopyFrom(details1) wdetails2 = other_servers.details_wrapper.add() wdetails2.f1 = 0 wdetails2.f2 = 0 details4 = wdetails2.details.add() details4.CopyFrom(details2) other_servers.port = 3022 payload = msg.SerializeToString() # Send size of payload as 2 bytes self.request.sendall(struct.pack('!h', len(payload))) self.request.sendall(payload) msg = tcp_node_msgs_pb2.RecurringTCPResponse() msg.player_id = hello.player_id msg.f3 = 0 msg.f11 = 1 payload = msg.SerializeToString() while True: tcpthreadevent.wait(timeout=25) try: self.request.sendall(struct.pack('!h', len(payload))) self.request.sendall(payload) except: break