def get_applications_async(
            self, client_addr, client_port, server_addr, server_port, callback, timeout=10):
        """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"""
        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
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
nogotofail/mitm/blame/app_blame.py