From 9feade6d7afdfb1075877e6e098e64550351b333 Mon Sep 17 00:00:00 2001 From: Mauro Sardara Date: Fri, 22 Sep 2017 15:44:01 +0200 Subject: Add simple applications for ICN17 tutorial Change-Id: Ic76e73c87e0313056356a02d8ec45d6e337288cb Signed-off-by: Mauro Sardara --- apps/consumers/CMakeLists.txt | 6 ++ apps/consumers/icnet_consumer_hello_world.cc | 119 +++++++++++++++++++++ apps/consumers/icnet_consumer_test.cc | 1 + apps/producers/CMakeLists.txt | 8 ++ apps/producers/icnet_producer_hello_world.cc | 118 ++++++++++++++++++++ icnet/http/icnet_http_server_publisher.cc | 4 +- icnet/transport/icnet_transport_socket_producer.cc | 1 + icnet/transport/icnet_transport_socket_producer.h | 2 +- 8 files changed, 255 insertions(+), 4 deletions(-) create mode 100755 apps/consumers/icnet_consumer_hello_world.cc create mode 100755 apps/producers/icnet_producer_hello_world.cc diff --git a/apps/consumers/CMakeLists.txt b/apps/consumers/CMakeLists.txt index 86752da7..757d0219 100755 --- a/apps/consumers/CMakeLists.txt +++ b/apps/consumers/CMakeLists.txt @@ -14,8 +14,14 @@ cmake_minimum_required(VERSION 3.2) set(CONSUMER_SOURCE_FILES icnet_consumer_test.cc) +set(CONSUMER__HELLO_WORLD_SOURCE_FILES icnet_consumer_hello_world.cc) add_executable(consumer-test ${CONSUMER_SOURCE_FILES}) target_link_libraries(consumer-test icnet ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) install(TARGETS consumer-test DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT library) + +add_executable(consumer-hello-world ${CONSUMER__HELLO_WORLD_SOURCE_FILES}) + +target_link_libraries(consumer-hello-world icnet ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) +install(TARGETS consumer-hello-world DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT library) diff --git a/apps/consumers/icnet_consumer_hello_world.cc b/apps/consumers/icnet_consumer_hello_world.cc new file mode 100755 index 00000000..266dab70 --- /dev/null +++ b/apps/consumers/icnet_consumer_hello_world.cc @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "icnet_transport_socket_consumer.h" +#include "icnet_utils_daemonizator.h" + +namespace icnet { + +namespace transport { + +class IcnetConsumerHelloWorld { + public: + IcnetConsumerHelloWorld() + : c_(Name(), TransportProtocolAlgorithms::RAAQM) { + c_.setSocketOption(GeneralTransportOptions::INTEREST_LIFETIME, 1001); + + c_.setSocketOption(GeneralTransportOptions::MAX_INTEREST_RETX, 25); + + c_.setSocketOption(ConsumerCallbacksOptions::CONTENT_OBJECT_TO_VERIFY, + (ConsumerContentObjectVerificationCallback) std::bind(&IcnetConsumerHelloWorld::verifyPacket, + this, + std::placeholders::_1, + std::placeholders::_2)); + + c_.setSocketOption(ConsumerCallbacksOptions::CONTENT_RETRIEVED, + (ConsumerContentCallback) std::bind(&IcnetConsumerHelloWorld::processContent, + this, + std::placeholders::_1, + std::placeholders::_2)); + + c_.setSocketOption(ConsumerCallbacksOptions::INTEREST_OUTPUT, + (ConsumerInterestCallback) std::bind(&IcnetConsumerHelloWorld::processLeavingInterest, + this, + std::placeholders::_1, + std::placeholders::_2)); + } + + void run(Name name) { + c_.consume(name); + } + + void stop() { + c_.stop(); + } + + private: + bool verifyPacket(ConsumerSocket &c, const ContentObject &contentObject) { + return true; + } + + void processContent(ConsumerSocket &c, std::vector &&payload) { + std::cout << "Content retrieved!! Size: " << payload.size() << std::endl; + + // Save content to a file + std::ofstream file("consumer_hello_world_file", std::ofstream::binary); + file.write(reinterpret_cast(payload.data()), payload.size()); + file.close(); + } + + void processLeavingInterest(ConsumerSocket &c, const Interest &interest) { + std::cout << "Sending interest with name " << interest.getName() << std::endl; + } + private: + ConsumerSocket c_; +}; + +int main(int argc, char *argv[]) { + bool daemon = false; + + int opt; + while ((opt = getopt(argc, argv, "D")) != -1) { + switch (opt) { + case 'D': + daemon = true; + break; + default: + exit(EXIT_FAILURE); + } + } + + std::string name = "ccnx:/helloworld"; + + if (argv[optind] == 0) { + std::cerr << "Using default name ccnx:/helloworld" << std::endl; + } else { + name = argv[optind]; + } + + if (daemon) { + utils::Daemonizator::daemonize(); + } + + IcnetConsumerHelloWorld consumer; + consumer.run(Name(name.c_str())); + consumer.stop(); + + return 0; + +} + +} // end namespace icnet + +} // end namespace transport + +int main(int argc, char *argv[]) { + return icnet::transport::main(argc, argv); +} diff --git a/apps/consumers/icnet_consumer_test.cc b/apps/consumers/icnet_consumer_test.cc index 5c7eecb0..c10f25ce 100755 --- a/apps/consumers/icnet_consumer_test.cc +++ b/apps/consumers/icnet_consumer_test.cc @@ -1,3 +1,4 @@ +/* /* * Copyright (c) 2017 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/apps/producers/CMakeLists.txt b/apps/producers/CMakeLists.txt index 9259394e..37366362 100755 --- a/apps/producers/CMakeLists.txt +++ b/apps/producers/CMakeLists.txt @@ -17,6 +17,14 @@ cmake_minimum_required(VERSION 3.2) set(PRODUCER_SOURCE_FILES icnet_producer_test.cc) +set(PRODUCER_HELLO_WORLD_SOURCE_FILES + icnet_producer_hello_world.cc) + add_executable(producer-test ${PRODUCER_SOURCE_FILES}) +add_executable(producer-hello-world ${PRODUCER_HELLO_WORLD_SOURCE_FILES}) + target_link_libraries(producer-test icnet ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) +target_link_libraries(producer-hello-world icnet ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) + install(TARGETS producer-test DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT library) +install(TARGETS producer-hello-world DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT library) diff --git a/apps/producers/icnet_producer_hello_world.cc b/apps/producers/icnet_producer_hello_world.cc new file mode 100755 index 00000000..883f1a22 --- /dev/null +++ b/apps/producers/icnet_producer_hello_world.cc @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "icnet_transport_socket_producer.h" +#include "icnet_utils_daemonizator.h" + +#define IDENTITY_NAME "cisco" + +namespace icnet { + +namespace transport { + +class IcnetProducerHelloWorld { + +public: + IcnetProducerHelloWorld(Name& prefix) + : prefix_(prefix), + p_(prefix_) { + + p_.setSocketOption(ProducerCallbacksOptions::INTEREST_INPUT, + (ProducerInterestCallback) bind(&IcnetProducerHelloWorld::processIncomingInterest, + this, + std::placeholders::_1, + std::placeholders::_2)); + + p_.setSocketOption(ProducerCallbacksOptions::CACHE_MISS, + (ProducerInterestCallback) bind(&IcnetProducerHelloWorld::processInterest, + this, + std::placeholders::_1, + std::placeholders::_2)); + + } + + void publish_content(Name name, uint8_t *buffer, std::size_t size) { + p_.produce(name, buffer, size); + } + + void run() { + p_.attach(); + p_.serveForever(); + } + +private: + void processIncomingInterest(ProducerSocket &p, const Interest &interest) { + // A new interest has been received! + std::cout << "Received interest with name " << interest.getName() << std::endl; + } + + void processInterest(ProducerSocket &p, const Interest &interest) { + // The received interest did not hit any content object in the cache! + std::cout << "The interest with name " << interest.getName() << " cannot be satisfied!" << std::endl; + } + +private: + Name prefix_; + ProducerSocket p_; +}; + +int main(int argc, char **argv) { + std::string name = "ccnx:/helloworld"; + unsigned long download_size = 0; + bool daemon = false; + + int opt; + while ((opt = getopt(argc, argv, "Ds:")) != -1) { + + switch (opt) { + case 'D': + daemon = true; + break; + case 's': + download_size = std::stoul(optarg); + break; + default: + exit(EXIT_FAILURE); + } + } + + if (argv[optind] == 0) { + std::cerr << "Using default name ccnx:/helloworld" << std::endl; + } else { + name = argv[optind]; + } + + if (daemon) { + utils::Daemonizator::daemonize(); + } + + Name n(name.c_str()); + std::string content(10000, 'A'); + + IcnetProducerHelloWorld producer(n); + producer.publish_content(n, (uint8_t *)content.data(), content.size()); + producer.run(); + + return 0; +} + +} // end namespace transport + +} // end namespace icnet + +int main(int argc, char **argv) { + return icnet::transport::main(argc, argv); +} + diff --git a/icnet/http/icnet_http_server_publisher.cc b/icnet/http/icnet_http_server_publisher.cc index e42154b2..82c90051 100644 --- a/icnet/http/icnet_http_server_publisher.cc +++ b/icnet/http/icnet_http_server_publisher.cc @@ -39,9 +39,7 @@ HTTPServerPublisher& HTTPServerPublisher::attachPublisher() { HTTPServerPublisher &HTTPServerPublisher::setTimeout(uint32_t timeout) { std::shared_ptr portal; producer_->getSocketOption(transport::GeneralTransportOptions::PORTAL, portal); - timer_ = std::unique_ptr(new boost::asio::deadline_timer(portal->getIoService(), - boost::posix_time::seconds( - timeout))); + timer_ = std::unique_ptr(new boost::asio::deadline_timer(portal->getIoService(), boost::posix_time::seconds(timeout))); wait_callback_ = [this](const boost::system::error_code e) { if (!e) { diff --git a/icnet/transport/icnet_transport_socket_producer.cc b/icnet/transport/icnet_transport_socket_producer.cc index ec5f665f..7be2fbd1 100644 --- a/icnet/transport/icnet_transport_socket_producer.cc +++ b/icnet/transport/icnet_transport_socket_producer.cc @@ -183,6 +183,7 @@ void ProducerSocket::produce(Name name, const uint8_t *buf, size_t buffer_size, seq_number_map_[name.toString()][response_id] = current_segment; } + if (making_manifest_) { std::shared_ptr content_object_segment; diff --git a/icnet/transport/icnet_transport_socket_producer.h b/icnet/transport/icnet_transport_socket_producer.h index 4f98f9e2..588ee2d6 100644 --- a/icnet/transport/icnet_transport_socket_producer.h +++ b/icnet/transport/icnet_transport_socket_producer.h @@ -44,7 +44,7 @@ class ProducerSocket : public Socket { void dispatch(); - void produce(Name name, const uint8_t *buffer, size_t buffer_size, const int request_id = 0, bool is_last = false); + void produce(Name name, const uint8_t *buffer, size_t buffer_size, const int request_id = 0, bool is_last = true); void produce(ContentObject &content_object); -- cgit 1.2.3-korg