RTI Secure Wan Transport  Version 5.3.0
 All Data Structures Functions Variables Typedefs Enumerations Groups Pages
HelloWorld_publisher.cxx

[$(HOME)/rti_workspace//examples/connext_dds/c++/hello_world_dtls/HelloWorld_publisher.cxx]

/* HelloWorld_publisher.cxx
A publication of data of type HelloWorld
This file is derived from code automatically generated by the rtiddsgen
command:
rtiddsgen -language C++ -example <arch> HelloWorld.idl
Example publication of type HelloWorld automatically generated by
'rtiddsgen'. To test them follow these steps:
(1) Compile this file and the example subscription.
(2) Start the subscription on the same domain used for RTI Connext with the command
objs/<arch>/HelloWorld_subscriber <domain_id> <sample_count>
(3) Start the publication on the same domain used for RTI Connext with the command
objs/<arch>/HelloWorld_publisher <domain_id> <sample_count>
(4) [Optional] Specify the list of discovery initial peers and
multicast receive addresses via an environment variable or a file
(in the current working directory) called NDDS_DISCOVERY_PEERS.
You can run any number of publishers and subscribers programs, and can
add and remove them dynamically from the domain.
Example:
To run the example application on domain <domain_id>:
On Unix:
objs/<arch>/HelloWorld_publisher <domain_id>
objs/<arch>/HelloWorld_subscriber <domain_id>
On Windows:
objs<arch>\HelloWorld_publisher <domain_id>
objs<arch>\HelloWorld_subscriber <domain_id>
modification history
------------ -------
*/
#include <stdio.h>
#include <stdlib.h>
#include "ndds/ndds_cpp.h"
#include "HelloWorld.h"
#include "HelloWorldSupport.h"
/* uncomment to use DTLS static libs */
/*#define USE_STATIC_LINK*/
#ifdef USE_STATIC_LINK
#include "transport_tls/transport_tls_plugin.h"
#endif
/* String length defined in the IDL */
#define MSG_LENGTH 128
#ifdef RTI_WIN32
#define RTI_SNPRINTF sprintf_s
#else
#define RTI_SNPRINTF snprintf
#endif
/* Delete all entities */
static int publisher_shutdown(
DDSDomainParticipant *participant)
{
int status = 0;
if (participant != NULL) {
retcode = participant->delete_contained_entities();
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "delete_contained_entities error %d\n", retcode);
status = -1;
}
retcode = DDSTheParticipantFactory->delete_participant(participant);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "delete_participant error %d\n", retcode);
status = -1;
}
}
/* RTI Connext provides finalize_instance() method on
domain participant factory for people who want to release memory used
by the participant factory and singleton. Uncomment the following
block of code for clean destruction of the singleton. */
/*
retcode = DDSDomainParticipantFactory::finalize_instance();
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "finalize_instance error %d\n", retcode);
status = -1;
}
*/
return status;
}
extern "C" int publisher_main(int domainId, int sample_count)
{
DDSDomainParticipant *participant = NULL;
DDSPublisher *publisher = NULL;
DDSTopic *topic = NULL;
DDSDataWriter *writer = NULL;
HelloWorldDataWriter *HelloWorld_writer = NULL;
HelloWorld *instance = NULL;
const char *type_name = NULL;
int count = 0;
struct DDS_Duration_t send_period = {4,0};
struct DDS_DomainParticipantQos participant_qos;
/* Get default participant QoS from participant factory */
retcode = DDSDomainParticipantFactory::get_instance()->get_default_participant_qos(
participant_qos);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "Failed to get default participant qos\n");
publisher_shutdown(participant);
return -1;
}
/* Disable builtin transports */
/* Set up property Qos to load plugin */
retcode = DDSPropertyQosPolicyHelper::add_property(
participant_qos.property,
"dds.transport.load_plugins", "dds.transport.DTLS.dtls1",
DDS_BOOLEAN_FALSE);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "Failed to add property dds.transport.load_plugins\n");
publisher_shutdown(participant);
}
#ifdef USE_STATIC_LINK
/* create function ptr */
retcode = DDSPropertyQosPolicyHelper::add_pointer_property(
participant_qos.property,
"dds.transport.DTLS.dtls1.create_function_ptr",
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "Failed to add property dds.transport.DTLS.dtls1.create_function_ptr\n");
publisher_shutdown(participant);
}
#else
/* library */
retcode = DDSPropertyQosPolicyHelper::add_property(
participant_qos.property,
"dds.transport.DTLS.dtls1.library",
"nddstransporttls",
DDS_BOOLEAN_FALSE);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "Failed to add property dds.transport.DTLS.dtls1.library\n");
publisher_shutdown(participant);
}
/* create function */
retcode = DDSPropertyQosPolicyHelper::add_property(
participant_qos.property,
"dds.transport.DTLS.dtls1.create_function",
"NDDS_Transport_DTLS_create",
DDS_BOOLEAN_FALSE);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "Failed to add property dds.transport.DTLS.dtls1.create_function\n");
publisher_shutdown(participant);
}
#endif
/* certificate authority */
retcode = DDSPropertyQosPolicyHelper::add_property(
participant_qos.property,
"dds.transport.DTLS.dtls1.tls.verify.ca_file", "cacert.pem",
DDS_BOOLEAN_FALSE);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "Failed to add property dds.transport.DTLS.dtls1.tls.verify.ca_file\n");
publisher_shutdown(participant);
}
/* certificate chain */
retcode = DDSPropertyQosPolicyHelper::add_property(
participant_qos.property,
"dds.transport.DTLS.dtls1.tls.identity.certificate_chain_file",
"peer1.pem", DDS_BOOLEAN_FALSE);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "Failed to add property dds.transport.DTLS.dtls1.tls.identity.certificate_chain_file\n");
publisher_shutdown(participant);
}
participant = DDSTheParticipantFactory->create_participant(
domainId, participant_qos,
NULL /* listener */, DDS_STATUS_MASK_NONE);
if (participant == NULL) {
fprintf(stderr, "create_participant error\n");
publisher_shutdown(participant);
return -1;
}
/* To customize publisher QoS, use
participant->get_default_publisher_qos() */
publisher = participant->create_publisher(
if (publisher == NULL) {
fprintf(stderr, "create_publisher error\n");
publisher_shutdown(participant);
return -1;
}
/* Register type before creating topic */
type_name = HelloWorldTypeSupport::get_type_name();
retcode = HelloWorldTypeSupport::register_type(
participant, type_name);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "register_type error %d\n", retcode);
publisher_shutdown(participant);
return -1;
}
/* To customize topic QoS, use
participant->get_default_topic_qos() */
topic = participant->create_topic(
"Example HelloWorld",
type_name, DDS_TOPIC_QOS_DEFAULT, NULL /* listener */,
if (topic == NULL) {
fprintf(stderr, "create_topic error\n");
publisher_shutdown(participant);
return -1;
}
/* To customize data writer QoS, use
publisher->get_default_datawriter_qos() */
writer = publisher->create_datawriter(
topic, DDS_DATAWRITER_QOS_DEFAULT, NULL /* listener */,
if (writer == NULL) {
fprintf(stderr, "create_datawriter error\n");
publisher_shutdown(participant);
return -1;
}
HelloWorld_writer = HelloWorldDataWriter::narrow(writer);
if (HelloWorld_writer == NULL) {
fprintf(stderr, "DataWriter narrow error\n");
publisher_shutdown(participant);
return -1;
}
/* Create data sample for writing */
instance = HelloWorldTypeSupport::create_data();
if (instance == NULL) {
fprintf(stderr, "HelloWorldTypeSupport::create_data error\n");
publisher_shutdown(participant);
return -1;
}
/* For data type that has key, if the same instance is going to be
written multiple times, initialize the key here
and register the keyed instance prior to writing */
/*
instance_handle = HelloWorld_writer->register_instance(*instance);
*/
/* Main loop */
for (count=0; (sample_count == 0) || (count < sample_count); ++count) {
printf("Writing HelloWorld to DTLS, count %d\n", count);
fflush(stdout);
/* Modify the data to be sent here */
RTI_SNPRINTF(
instance->msg,
MSG_LENGTH,
"Hello Secure World! (%d)",
count);
instance->msg[MSG_LENGTH-1] = '\0';
retcode = HelloWorld_writer->write(*instance, instance_handle);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "write error %d\n", retcode);
}
NDDSUtility::sleep(send_period);
}
/*
retcode = HelloWorld_writer->unregister_instance(
*instance, instance_handle);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "unregister instance error %d\n", retcode);
}
*/
/* Delete data sample */
retcode = HelloWorldTypeSupport::delete_data(instance);
if (retcode != DDS_RETCODE_OK) {
fprintf(stderr, "HelloWorldTypeSupport::delete_data error %d\n", retcode);
}
/* Delete all entities */
return publisher_shutdown(participant);
}
#if defined(RTI_WINCE)
int wmain(int argc, wchar_t** argv)
{
int domainId = 0;
int sample_count = 0; /* infinite loop */
if (argc >= 2) {
domainId = _wtoi(argv[1]);
}
if (argc >= 3) {
sample_count = _wtoi(argv[2]);
}
/* Uncomment this to turn on additional logging
NDDSConfigLogger::get_instance()->
set_verbosity_by_category(NDDS_CONFIG_LOG_CATEGORY_API,
NDDS_CONFIG_LOG_VERBOSITY_STATUS_ALL);
*/
return publisher_main(domainId, sample_count);
}
#elif !(defined(RTI_VXWORKS) && !defined(__RTP__)) && !defined(RTI_PSOS)
int main(int argc, char *argv[])
{
int domainId = 0;
int sample_count = 0; /* infinite loop */
if (argc >= 2) {
domainId = atoi(argv[1]);
}
if (argc >= 3) {
sample_count = atoi(argv[2]);
}
/* Uncomment this to turn on additional logging
NDDSConfigLogger::get_instance()->
set_verbosity_by_category(NDDS_CONFIG_LOG_CATEGORY_API,
NDDS_CONFIG_LOG_VERBOSITY_STATUS_ALL);
*/
return publisher_main(domainId, sample_count);
}
#endif

RTI Secure Wan Transport Version 5.3.0 Copyright © Sun Jun 25 2017 Real-Time Innovations, Inc