'Fetch the application information for a given connection tuple calling a callback when
the response is received.
Returns if the request was sent to the client.
NOTE: If False is returned the callback will never be called.
Arguments:
client_addr -- the client ip address to query
client_port -- the source port on the client
server_addr -- the destination ip address as seen by the client
server_port -- the destination port as seen by the client
callback -- function to call when data is ready, should be of the form
def fn(success, platform_info=None, applications=None)
timeout --  timeout for the request'

def get_applications_async(self, client_addr, client_port, server_addr, server_port, callback, timeout=10):

    if (not self.client_available(client_addr)):
        return False
    if (not self.clients[client_addr].get_applications_async(client_port, server_addr, server_port, callback, timeout)):
        self.remove_client(self.clients[client_addr])
        return False
    return True
