def send_request_and_get_reply_and_data(
    server_node_name,
    server_address, 
    client_tag, 
    client_address, 
    request, 
    data=None
):
    log = logging.getLogger("send_request_and_get_reply_and_data")
    context = zmq.Context()
    deliverator = Deliverator()

    pull_server = GreenletPULLServer(
        context, 
        client_address,
        deliverator
    )
    pull_server.start()

    resilient_client = GreenletResilientClient(
        context,
        server_node_name,
        server_address,
        client_tag,
        client_address,
        deliverator,
    )
    resilient_client.start()

    # loop until the resilient client connects
    test_status_count = 0
    while True:
        status_name, _, __ = resilient_client.test_current_status()
        if status_name == "connected":
            break
        test_status_count += 1
        if test_status_count > 5:
            log.error("too many status retries")
            raise UtilError("too many status retries")

        log.warn("status retry delay")
        gevent.sleep(10.0)

    delivery_channel = resilient_client.queue_message_for_send(request, data)
    reply, data = delivery_channel.get()

    pull_server.kill()
    resilient_client.kill()
    pull_server.join()
    resilient_client.join()

    context.term()
    return reply, data