Fix signed-unsigned comparison warnings, plus lots of other cleanups.
Change-Id: I09a5c0e97dd40c6f321948e2304883e53aafe0d4
diff --git a/src/ndn-traffic-server.cpp b/src/ndn-traffic-server.cpp
index 2c78dba..9351f75 100644
--- a/src/ndn-traffic-server.cpp
+++ b/src/ndn-traffic-server.cpp
@@ -1,17 +1,33 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/**
- * Copyright (C) 2014 University of Arizona.
+ * Copyright (C) 2014-2015 University of Arizona.
*
- * GNU 3.0 License, see the LICENSE file for more information
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Author: Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
*/
-#include <sstream>
+#include <cctype>
+#include <cstdlib>
+#include <fstream>
+#include <string>
+#include <unistd.h>
+#include <vector>
-#include <boost/asio.hpp>
+#include <boost/asio/io_service.hpp>
+#include <boost/asio/signal_set.hpp>
#include <boost/filesystem.hpp>
-#include <boost/lexical_cast.hpp>
#include <boost/noncopyable.hpp>
#include <ndn-cxx/face.hpp>
@@ -24,9 +40,8 @@
class NdnTrafficServer : boost::noncopyable
{
public:
-
explicit
- NdnTrafficServer(char* programName)
+ NdnTrafficServer(const char* programName)
: m_logger("NdnTrafficServer")
, m_programName(programName)
, m_hasError(false)
@@ -35,9 +50,9 @@
, m_nMaximumInterests(-1)
, m_nInterestsReceived(0)
, m_contentDelay(time::milliseconds(-1))
+ , m_instanceId(std::to_string(std::rand()))
, m_face(m_ioService)
{
- m_instanceId = boost::lexical_cast<std::string>(std::rand());
}
class DataTrafficConfiguration
@@ -55,54 +70,54 @@
void
printTrafficConfiguration(Logger& logger)
{
- std::string detail = "";
- if (m_name != "")
+ std::string detail;
+
+ if (!m_name.empty())
detail += "Name=" + m_name + ", ";
if (m_contentType >= 0)
- detail += "ContentType=" + boost::lexical_cast<std::string>(m_contentType) + ", ";
+ detail += "ContentType=" + std::to_string(m_contentType) + ", ";
if (m_freshnessPeriod >= time::milliseconds(0))
detail += "FreshnessPeriod=" +
- boost::lexical_cast<std::string>(static_cast<int>(m_freshnessPeriod.count())) + ", ";
+ std::to_string(static_cast<int>(m_freshnessPeriod.count())) + ", ";
if (m_contentBytes >= 0)
- detail += "ContentBytes=" + boost::lexical_cast<std::string>(m_contentBytes) + ", ";
+ detail += "ContentBytes=" + std::to_string(m_contentBytes) + ", ";
if (m_contentDelay >= time::milliseconds(0))
- detail += "ContentDelay=" +
- boost::lexical_cast<std::string>(m_contentDelay.count()) + ", ";
- if (m_content != "")
+ detail += "ContentDelay=" + std::to_string(m_contentDelay.count()) + ", ";
+ if (!m_content.empty())
detail += "Content=" + m_content + ", ";
if (detail.length() >= 2)
detail = detail.substr(0, detail.length() - 2);
+
logger.log(detail, false, false);
}
-
bool
- extractParameterValue(const std::string& detail,
- std::string& parameter,
- std::string& value)
+ extractParameterValue(const std::string& detail, std::string& parameter, std::string& value)
{
std::string allowedCharacters = ":/+._-%";
+ std::size_t i = 0;
+
parameter = "";
value = "";
- int i = 0;
- while (detail[i] != '=' && i < detail.length())
- {
- parameter += detail[i];
- i++;
- }
+ while (detail[i] != '=' && i < detail.length()) {
+ parameter += detail[i];
+ i++;
+ }
if (i == detail.length())
return false;
+
i++;
while ((std::isalnum(detail[i]) ||
allowedCharacters.find(detail[i]) != std::string::npos) &&
- i < detail.length())
- {
- value += detail[i];
- i++;
- }
- if(parameter == "" || value == "")
+ i < detail.length()) {
+ value += detail[i];
+ i++;
+ }
+
+ if (parameter.empty() || value.empty())
return false;
- return true;
+ else
+ return true;
}
bool
@@ -116,22 +131,22 @@
if (parameter == "Name")
m_name = value;
else if (parameter == "ContentType")
- m_contentType = boost::lexical_cast<int>(value);
+ m_contentType = std::stoi(value);
else if (parameter == "FreshnessPeriod")
- m_freshnessPeriod = time::milliseconds(boost::lexical_cast<int>(value));
+ m_freshnessPeriod = time::milliseconds(std::stoi(value));
else if (parameter == "ContentDelay")
- m_contentDelay = time::milliseconds(boost::lexical_cast<int>(value));
+ m_contentDelay = time::milliseconds(std::stoi(value));
else if (parameter == "ContentBytes")
- m_contentBytes = boost::lexical_cast<int>(value);
+ m_contentBytes = std::stoi(value);
else if (parameter == "Content")
m_content = value;
else
- logger.log("Line " + boost::lexical_cast<std::string>(lineNumber) +
+ logger.log("Line " + std::to_string(lineNumber) +
" \t- Invalid Parameter='" + parameter + "'", false, true);
}
else
{
- logger.log("Line " + boost::lexical_cast<std::string>(lineNumber) +
+ logger.log("Line " + std::to_string(lineNumber) +
" \t- Improper Traffic Configuration Line - " + detail, false, true);
return false;
}
@@ -144,6 +159,7 @@
return true;
}
+ private:
std::string m_name;
int m_contentType;
time::milliseconds m_freshnessPeriod;
@@ -152,22 +168,25 @@
std::string m_content;
int m_nInterestsReceived;
+ friend class NdnTrafficServer;
};
void
- usage()
+ usage() const
{
-
- std::cout << "\nUsage: " << m_programName << " [options] <Traffic_Configuration_File>\n"
- "Respond to Interest as per provided Traffic Configuration File\n"
- "Multiple Prefixes can be configured for handling.\n"
- "Set environment variable NDN_TRAFFIC_LOGFOLDER for redirecting output to a log.\n"
- " [-d interval] - set delay before responding to interest in milliseconds\n"
- " [-c count] - specify maximum number of interests to be satisfied\n"
- " [-q] - quiet logging - no interest reception/data generation messages\n"
- " [-h] - print help and exit\n\n";
- exit(1);
-
+ std::cout << "Usage:\n"
+ << " " << m_programName << " [options] <Traffic_Configuration_File>\n"
+ << "\n"
+ << "Respond to Interests as per provided Traffic Configuration File.\n"
+ << "Multiple prefixes can be configured for handling.\n"
+ << "Set environment variable NDN_TRAFFIC_LOGFOLDER to redirect output to a log file.\n"
+ << "\n"
+ << "Options:\n"
+ << " [-d interval] - set delay before responding to interest, in milliseconds\n"
+ << " [-c count] - specify maximum number of interests to be satisfied\n"
+ << " [-q] - quiet mode: no interest reception/data generation logging\n"
+ << " [-h] - print this help text and exit\n";
+ exit(EXIT_FAILURE);
}
void
@@ -193,7 +212,7 @@
}
void
- setConfigurationFile(char* configurationFile)
+ setConfigurationFile(const char* configurationFile)
{
m_configurationFile = configurationFile;
}
@@ -208,13 +227,12 @@
signalHandler()
{
logStatistics();
+
m_logger.shutdownLogger();
m_face.shutdown();
m_ioService.stop();
- if (m_hasError)
- exit(1);
- else
- exit(0);
+
+ exit(m_hasError ? EXIT_FAILURE : EXIT_SUCCESS);
}
void
@@ -222,19 +240,19 @@
{
m_logger.log("\n\n== Interest Traffic Report ==\n", false, true);
m_logger.log("Total Traffic Pattern Types = " +
- boost::lexical_cast<std::string>(m_trafficPatterns.size()), false, true);
+ std::to_string(m_trafficPatterns.size()), false, true);
m_logger.log("Total Interests Received = " +
- boost::lexical_cast<std::string>(m_nInterestsReceived), false, true);
+ std::to_string(m_nInterestsReceived), false, true);
+
if (m_nInterestsReceived < m_nMaximumInterests)
m_hasError = true;
- for (int patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
+
+ for (std::size_t patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
{
- m_logger.log("\nTraffic Pattern Type #" +
- boost::lexical_cast<std::string>(patternId + 1), false, true);
+ m_logger.log("\nTraffic Pattern Type #" + std::to_string(patternId + 1), false, true);
m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
- m_logger.log("Total Interests Received = " +
- boost::lexical_cast<std::string>(
- m_trafficPatterns[patternId].m_nInterestsReceived) + "\n", false, true);
+ m_logger.log("Total Interests Received = " + std::to_string(
+ m_trafficPatterns[patternId].m_nInterestsReceived) + "\n", false, true);
}
}
@@ -250,10 +268,10 @@
std::string patternLine;
std::ifstream patternFile;
m_logger.log("Analyzing Traffic Configuration File: " + m_configurationFile, true, true);
+
patternFile.open(m_configurationFile.c_str());
if (patternFile.is_open())
{
- int patternId = 0;
int lineNumber = 0;
while (getline(patternFile, patternLine))
{
@@ -262,15 +280,12 @@
{
DataTrafficConfiguration dataData;
bool shouldSkipLine = false;
- patternId++;
if (dataData.processConfigurationDetail(patternLine, m_logger, lineNumber))
{
while (getline(patternFile, patternLine) && std::isalpha(patternLine[0]))
{
lineNumber++;
- if (!dataData.processConfigurationDetail(patternLine,
- m_logger,
- lineNumber))
+ if (!dataData.processConfigurationDetail(patternLine, m_logger, lineNumber))
{
shouldSkipLine = true;
break;
@@ -288,18 +303,20 @@
}
}
patternFile.close();
+
if (!checkTrafficPatternCorrectness())
{
- m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper- " +
+ m_logger.log("ERROR - Traffic Configuration Provided Is Not Proper - " +
m_configurationFile, false, true);
m_logger.shutdownLogger();
- exit(1);
+ exit(EXIT_FAILURE);
}
+
m_logger.log("Traffic Configuration File Processing Completed\n", true, false);
- for (patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
+ for (std::size_t patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
{
m_logger.log("Traffic Pattern Type #" +
- boost::lexical_cast<std::string>(patternId + 1), false, false);
+ std::to_string(patternId + 1), false, false);
m_trafficPatterns[patternId].printTrafficConfiguration(m_logger);
m_logger.log("", false, false);
}
@@ -309,7 +326,7 @@
m_logger.log("ERROR - Unable To Open Traffic Configuration File: " +
m_configurationFile, false, true);
m_logger.shutdownLogger();
- exit(1);
+ exit(EXIT_FAILURE);
}
}
@@ -327,7 +344,7 @@
m_logger.log("ERROR - Traffic Configuration File Is Not A Regular File: " +
m_configurationFile, false, true);
m_logger.shutdownLogger();
- exit(1);
+ exit(EXIT_FAILURE);
}
}
else
@@ -335,15 +352,15 @@
m_logger.log("ERROR - Traffic Configuration File Does Not Exist: " +
m_configurationFile, false, true);
m_logger.shutdownLogger();
- exit(1);
+ exit(EXIT_FAILURE);
}
}
static std::string
- getRandomByteString(int randomSize)
+ getRandomByteString(std::size_t randomSize)
{
std::string randomString;
- for (int i = 0; i < randomSize; i++)
+ for (std::size_t i = 0; i < randomSize; i++)
randomString += static_cast<char>(std::rand() % 128);
return randomString;
}
@@ -361,24 +378,26 @@
if (m_trafficPatterns[patternId].m_freshnessPeriod >= time::milliseconds(0))
data.setFreshnessPeriod(m_trafficPatterns[patternId].m_freshnessPeriod);
- std::string content = "";
+ std::string content;
if (m_trafficPatterns[patternId].m_contentBytes >= 0)
content = getRandomByteString(m_trafficPatterns[patternId].m_contentBytes);
- if (m_trafficPatterns[patternId].m_content != "")
+ if (!m_trafficPatterns[patternId].m_content.empty())
content = m_trafficPatterns[patternId].m_content;
data.setContent(reinterpret_cast<const uint8_t*>(content.c_str()), content.length());
m_keyChain.sign(data);
m_nInterestsReceived++;
m_trafficPatterns[patternId].m_nInterestsReceived++;
- std::string logLine = "Interest Received - PatternType=" +
- boost::lexical_cast<std::string>(patternId + 1);
- logLine += ", GlobalID=" + boost::lexical_cast<std::string>(m_nInterestsReceived);
- logLine += ", LocalID=" +
- boost::lexical_cast<std::string>(m_trafficPatterns[patternId].m_nInterestsReceived);
- logLine += ", Name=" + m_trafficPatterns[patternId].m_name;
- if (!m_hasQuietLogging)
+
+ if (!m_hasQuietLogging) {
+ std::string logLine =
+ "Interest Received - PatternType=" + std::to_string(patternId + 1) +
+ ", GlobalID=" + std::to_string(m_nInterestsReceived) +
+ ", LocalID=" + std::to_string(m_trafficPatterns[patternId].m_nInterestsReceived) +
+ ", Name=" + m_trafficPatterns[patternId].m_name;
m_logger.log(logLine, true, false);
+ }
+
if (m_trafficPatterns[patternId].m_contentDelay > time::milliseconds(-1))
usleep(m_trafficPatterns[patternId].m_contentDelay.count() * 1000);
if (m_contentDelay > time::milliseconds(-1))
@@ -397,11 +416,11 @@
void
onRegisterFailed(const ndn::Name& prefix, const std::string& reason, int patternId)
{
- std::string logLine = "";
- logLine += "Prefix Registration Failed - PatternType=" +
- boost::lexical_cast<std::string>(patternId + 1);
+ std::string logLine;
+ logLine += "Prefix Registration Failed - PatternType=" + std::to_string(patternId + 1);
logLine += ", Name=" + m_trafficPatterns[patternId].m_name;
m_logger.log(logLine, true, true);
+
m_nRegistrationsFailed++;
if (m_nRegistrationsFailed == m_trafficPatterns.size())
{
@@ -415,6 +434,7 @@
{
boost::asio::signal_set signalSet(m_ioService, SIGINT, SIGTERM);
signalSet.async_wait(bind(&NdnTrafficServer::signalHandler, this));
+
m_logger.initializeLog(m_instanceId);
initializeTrafficConfiguration();
if (m_nMaximumInterests == 0)
@@ -424,22 +444,16 @@
return;
}
- for (int patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
- {
- m_face.setInterestFilter(m_trafficPatterns[patternId].m_name,
- bind(&NdnTrafficServer::onInterest,
- this, _1, _2,
- patternId),
- bind(&NdnTrafficServer::onRegisterFailed,
- this, _1, _2,
- patternId));
- }
+ for (std::size_t patternId = 0; patternId < m_trafficPatterns.size(); patternId++)
+ m_face.setInterestFilter(m_trafficPatterns[patternId].m_name,
+ bind(&NdnTrafficServer::onInterest, this, _1, _2, patternId),
+ bind(&NdnTrafficServer::onRegisterFailed, this, _1, _2, patternId));
try {
m_face.processEvents();
}
- catch (std::exception& e) {
- m_logger.log("ERROR: " + static_cast<std::string>(e.what()), true, true);
+ catch (const std::exception& e) {
+ m_logger.log("ERROR: " + std::string(e.what()), true, true);
m_logger.shutdownLogger();
m_hasError = true;
m_ioService.stop();
@@ -452,7 +466,7 @@
std::string m_programName;
bool m_hasError;
bool m_hasQuietLogging;
- int m_nRegistrationsFailed;
+ std::size_t m_nRegistrationsFailed;
int m_nMaximumInterests;
int m_nInterestsReceived;
time::milliseconds m_contentDelay;
@@ -469,25 +483,26 @@
int
main(int argc, char* argv[])
{
- std::srand(std::time(0));
- ndn::NdnTrafficServer ndnTrafficServer(argv[0]);
+ std::srand(std::time(nullptr));
+
+ ndn::NdnTrafficServer server(argv[0]);
int option;
while ((option = getopt(argc, argv, "hqc:d:")) != -1) {
switch (option) {
case 'h':
- ndnTrafficServer.usage();
+ server.usage();
break;
case 'c':
- ndnTrafficServer.setMaximumInterests(atoi(optarg));
+ server.setMaximumInterests(atoi(optarg));
break;
case 'd':
- ndnTrafficServer.setContentDelay(atoi(optarg));
+ server.setContentDelay(atoi(optarg));
break;
case 'q':
- ndnTrafficServer.setQuietLogging();
+ server.setQuietLogging();
break;
default:
- ndnTrafficServer.usage();
+ server.usage();
break;
}
}
@@ -495,14 +510,11 @@
argc -= optind;
argv += optind;
- if (argv[0] == 0)
- ndnTrafficServer.usage();
+ if (!argc)
+ server.usage();
- ndnTrafficServer.setConfigurationFile(argv[0]);
- ndnTrafficServer.run();
+ server.setConfigurationFile(argv[0]);
+ server.run();
- if (ndnTrafficServer.hasError())
- return 1;
- else
- return 0;
+ return server.hasError() ? EXIT_FAILURE : EXIT_SUCCESS;
}