Modern C++ Request-Reply code example
The following is a simple example that shows how to use a Requester and a Replier in the RTI Connext Modern C++ Request-Reply API.
The types used in this example have the following IDL definition:
module directory_service {
struct DirectoryRequest {
string path;
};
enum Result {
OK, PERMISSION_ERROR, DOESNT_EXIST
};
struct DirectoryReply {
Result result;
sequence<string> files;
};
};
That can be generated with
rtiddsgen -language C++11 -stl -unboundedSupport -example <your architecture> DirectoryService.idl
(You'll need to modify the makefile or Visual Studio project to link with one additional library: rticonnextmsgcpp2)
The following code shows how to create a Requester, send a request, and receive a reply:
void requester_main(int domain_id)
{
using namespace directory_service;
dds::domain::DomainParticipant participant(domain_id);
rti::request::Requester<DirectoryRequest, DirectoryReply> requester(
participant,
"DirectoryService");
rti::util::sleep(dds::core::Duration::from_secs(2));
DirectoryRequest request("/usr/bin/");
requester.send_request(request);
auto replies = requester.receive_replies(dds::core::Duration::from_secs(10));
for (const auto& reply_sample : replies) {
if (reply_sample.info().valid()) {
if (reply_sample.data().result() == Result::OK) {
std::cout << "Received reply: " << reply_sample.data()
<< std::endl;
} else {
std::cout << "Request failed: " << reply_sample.data().result()
<< std::endl;
}
}
}
}
The following code shows how to create a Replier that will receive a request from the previous Requester and send a reply to it:
void replier_main(int domain_id)
{
using namespace directory_service;
// Create a DomainParticipant with default Qos
dds::domain::DomainParticipant participant(domain_id);
rti::request::Replier<DirectoryRequest, DirectoryReply> replier(
participant,
"DirectoryService");
bool keep_running = true;
while (keep_running) {
std::cout << "Waiting for requests..." << std::endl;
auto requests = replier.receive_requests(dds::core::Duration::from_secs(10));
for (const auto& request_sample : requests) {
if (request_sample.info().valid()) {
std::cout << "Received request for directory '"
<< request_sample.data().path() << "'" << std::endl;
DirectoryReply reply;
reply.files() = get_files_in_directory(request_sample.data().path());
reply.result(Result::OK);
replier.send_reply(
reply,
request_sample.info()->publication_virtual_sample_identity());
}
}
}
}
std::vector<std::string> get_files_in_directory(const std::string& path)
{
return std::vector<std::string>({path + "foo.txt", path + "bar.jpg"});
}
Comments
calvin_ccm
Mon, 02/25/2019 - 19:14
Permalink
which version of the DDS
which version of the DDS works with this example?
whats the header files required?