Running as a Client

This example shows a client performing the following:

  • initializing guardian

  • finding a service

  • connecting to an endpoint using profile configured transport security

  • finding a data channel

  • sending data over the data channel with configured application layer security

  • receiving data over the data channel with configured application layer security

Example

bool
guardian_client(
    const utilities::InitializeFiles& in_initialize_files)
{
    /* create guardian */
    Guardian guardian;

    /* initialize guardidan */
    if( !initialize_guardian("MyComponent",
                             "MyHardwareIdentifier",
                             in_initialize_files,
                             &guardian) )
    {
        return false;
    }

    /* find client service */
    std::unique_ptr<Service> service;
    auto status = guardian.FindService("MyClientServiceName", &service);
    if( status )
    {
        printf("error finding service [%s]:[%u]\r\n",
                    GuardianStatusEnum::NameOf(EXTRACT_STATUS(status)).c_str(),
                    status);
        return false;
    }

    /* start profile configured session (blocking) */
    std::unique_ptr<Session> session;
    status = service->Start(&session);
    if( status )
    {
        printf("error connecting to endpoint [%s]:[%u]\r\n",
                    GuardianStatusEnum::NameOf(EXTRACT_STATUS(status)).c_str(),
                    status);
        return false;
    }

    /* find profile configured secure channel */
    std::unique_ptr<ChannelGuard> channel;
    status = session->FindChannel("MyChannelName", &channel);
    if( status )
    {
        printf("error connecting to endpoint [%s]:[%u]\r\n",
                    GuardianStatusEnum::NameOf(EXTRACT_STATUS(status)).c_str(),
                    status);
        return false;
    }

    /* send data through profile configured channel and connection (blocking) */
    std::string tx = "Some data to send";
    status = channel->DataForChannel(tx.data(), tx.size());
    if( status )
    {
        printf("error sending data [%s]:[%u]\r\n",
                    GuardianStatusEnum::NameOf(EXTRACT_STATUS(status)).c_str(),
                    status);
        return false;
    }

    std::string rx(512, 0);
    size_t rx_size = rx.size();
    /* wait for server to respond (blocking) */
    status = channel->DataFromChannel(&rx[0], &rx_size);
    if( status )
    {
        printf("error receiving data [%s]:[%u]\r\n",
                    GuardianStatusEnum::NameOf(EXTRACT_STATUS(status)).c_str(),
                    status);
        return false;
    }

    guardian.Shutdown(true);

    return true;
}

Last updated

Was this helpful?