diff --git a/src/netanim/model/animation-interface.cc b/src/netanim/model/animation-interface.cc index e66c27e91..207a471e7 100644 --- a/src/netanim/model/animation-interface.cc +++ b/src/netanim/model/animation-interface.cc @@ -62,22 +62,10 @@ namespace ns3 { static bool initialized = false; std::map AnimationInterface::nodeDescriptions; -AnimationInterface::AnimationInterface () - : m_fHandle (STDOUT_FILENO), m_xml (false), m_mobilityPollInterval (Seconds(0.25)), - m_usingSockets (false), m_port (0), m_outputFileName (""), - m_outputFileSet (false), m_serverPortSet (false), gAnimUid (0),m_randomPosition (true), - m_writeCallback (0), m_started (false), - m_enablePacketMetadata (false), m_startTime (Seconds(0)), m_stopTime (Seconds(3600 * 1000)), - m_maxPktsPerFile (MAX_PKTS_PER_TRACE_FILE) -{ - initialized = true; - StartAnimation (); -} - AnimationInterface::AnimationInterface (const std::string fn, uint64_t maxPktsPerFile, bool usingXML) - : m_fHandle (STDOUT_FILENO), m_xml (usingXML), m_mobilityPollInterval (Seconds(0.25)), - m_usingSockets (false), m_port (0), m_outputFileName (fn), - m_outputFileSet (false), m_serverPortSet (false), gAnimUid (0), m_randomPosition (true), + : m_xml (usingXML), m_mobilityPollInterval (Seconds(0.25)), + m_outputFileName (fn), + m_outputFileSet (false), gAnimUid (0), m_randomPosition (true), m_writeCallback (0), m_started (false), m_enablePacketMetadata (false), m_startTime (Seconds(0)), m_stopTime (Seconds(3600 * 1000)), m_maxPktsPerFile (maxPktsPerFile), m_originalFileName (fn) @@ -86,18 +74,6 @@ AnimationInterface::AnimationInterface (const std::string fn, uint64_t maxPktsPe StartAnimation (); } -AnimationInterface::AnimationInterface (const uint16_t port, bool usingXML) - : m_fHandle (STDOUT_FILENO), m_xml (usingXML), m_mobilityPollInterval (Seconds(0.25)), - m_usingSockets (true), m_port (port), m_outputFileName (""), - m_outputFileSet (false), m_serverPortSet (false), gAnimUid (0), m_randomPosition (true), - m_writeCallback (0), m_started (false), - m_enablePacketMetadata (false), m_startTime (Seconds(0)), m_stopTime (Seconds(3600 * 1000)), - m_maxPktsPerFile (MAX_PKTS_PER_TRACE_FILE) -{ - initialized = true; - StartAnimation (); -} - AnimationInterface::~AnimationInterface () { StopAnimation (); @@ -142,21 +118,13 @@ bool AnimationInterface::SetOutputFile (const std::string& fn) { return true; } - if (fn == "") - { - m_fHandle = STDOUT_FILENO; - m_outputFileSet = true; - return true; - } NS_LOG_INFO ("Creating new trace file:" << fn.c_str ()); - FILE* f = fopen (fn.c_str (), "w"); - if (!f) + m_f = fopen (fn.c_str (), "w"); + if (!m_f) { NS_FATAL_ERROR ("Unable to open Animation output file"); return false; // Can't open } - m_fHandle = fileno (f); // Set the file handle - m_usingSockets = false; m_outputFileName = fn; m_outputFileSet = true; return true; @@ -199,39 +167,6 @@ bool AnimationInterface::IsInTimeWindow () return false; } -bool AnimationInterface::SetServerPort (uint16_t port) -{ -#if defined(HAVE_SYS_SOCKET_H) && defined(HAVE_NETINET_IN_H) - if (m_serverPortSet) - { - return true; - } - int s = socket (AF_INET, SOCK_STREAM, 0); - struct sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = htons (port); - addr.sin_addr.s_addr = htonl (INADDR_ANY); - if (bind (s, (struct sockaddr*)&addr, sizeof (addr)) < 0) - { - NS_LOG_WARN ("Can't bind to port " << port << ", exiting."); - return false; - } - listen (s, 1); - NS_LOG_INFO ("Waiting for animator connection"); - // Now wait for the animator to connect in - m_fHandle = accept (s, 0, 0); - NS_LOG_INFO ("Got animator connection from remote"); - // set the linger socket option - int t = 1; - setsockopt (s, SOL_SOCKET, SO_LINGER, &t, sizeof(t)); - m_usingSockets = true; - m_serverPortSet = true; - return true; -#endif - return false; // never reached unless the above is disabled - // which is done to support a platform like MinGW -} - bool AnimationInterface::WifiPacketIsPending (uint64_t AnimUid) { return (m_pendingWifiPackets.find (AnimUid) != m_pendingWifiPackets.end ()); @@ -416,14 +351,7 @@ void AnimationInterface::StartAnimation (bool restart) { m_currentPktCount = 0; m_started = true; - if (m_usingSockets) - { - SetServerPort (m_port); - } - else - { - SetOutputFile (m_outputFileName); - } + SetOutputFile (m_outputFileName); // Find the min/max x/y for the xml topology element m_topoMinX = -2; @@ -448,7 +376,7 @@ void AnimationInterface::StartAnimation (bool restart) oss << GetXMLOpen_anim (0); oss << GetPreamble (); oss << GetXMLOpen_topology (m_topoMinX, m_topoMinY, m_topoMaxX, m_topoMaxY); - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); } NS_LOG_INFO ("Setting topology for "<GetId (), v.x, v.y); - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); } else { @@ -468,7 +396,7 @@ void AnimationInterface::StartAnimation (bool restart) Vector v = GetPosition (n); oss << "0.0 N " << n->GetId () << " " << v.x << " " << v.y << std::endl; - WriteN (m_fHandle, oss.str ().c_str (), oss.str ().length ()); + WriteN (oss.str ().c_str (), oss.str ().length ()); } } NS_LOG_INFO ("Setting p2p links"); @@ -508,7 +436,7 @@ void AnimationInterface::StartAnimation (bool restart) { oss << "0.0 L " << n1Id << " " << n2Id << std::endl; } - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); } } } @@ -520,7 +448,7 @@ void AnimationInterface::StartAnimation (bool restart) } if (m_xml && !restart) { - WriteN (m_fHandle, GetXMLClose ("topology")); + WriteN (GetXMLClose ("topology")); Simulator::Schedule (m_mobilityPollInterval, &AnimationInterface::MobilityAutoCheck, this); } if (!restart) @@ -564,32 +492,24 @@ void AnimationInterface::StopAnimation () m_started = false; NS_LOG_INFO ("Stopping Animation"); ResetAnimWriteCallback (); - if (m_fHandle > 0) + if (m_f) { if (m_xml) { // Terminate the anim element - WriteN (m_fHandle, GetXMLClose ("anim")); + WriteN (GetXMLClose ("anim")); } - if (m_fHandle != STDOUT_FILENO) - { - close (m_fHandle); - } - m_outputFileSet = false; - m_fHandle = -1; + fclose (m_f); } + m_outputFileSet = false; } -int AnimationInterface::WriteN (int h, const std::string& st) +int AnimationInterface::WriteN (const std::string& st) { - if (h < 0) - { - return 0; - } if (m_writeCallback) { m_writeCallback (st.c_str ()); } - return WriteN (h, st.c_str (), st.length ()); + return WriteN (st.c_str (), st.length ()); } // Private methods @@ -655,19 +575,15 @@ void AnimationInterface::RecalcTopoBounds (Vector v) } } -int AnimationInterface::WriteN (HANDLETYPE h, const char* data, uint32_t count) +int AnimationInterface::WriteN (const char* data, uint32_t count) { - if (h < 0) - { - return 0; - } // Write count bytes to h from data uint32_t nLeft = count; const char* p = data; uint32_t written = 0; while (nLeft) { - int n = write (h, p, nLeft); + int n = fwrite (p, nLeft, 1, m_f); if (n <= 0) { return written; @@ -693,7 +609,7 @@ void AnimationInterface::WriteDummyPacket () oss << GetXMLOpenClose_rx (0, 0, fbRx, lbRx); oss << GetXMLClose ("packet"); } - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); } @@ -731,7 +647,7 @@ void AnimationInterface::DevTxTrace (std::string context, Ptr p, << (now + rxTime - txTime).GetSeconds () << " " // first bit rx time << (now + rxTime).GetSeconds () << std::endl; // last bit rx time } - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); } @@ -1129,7 +1045,7 @@ void AnimationInterface::MobilityCourseChangeTrace (Ptr mo oss << GetXMLOpen_topology (m_topoMinX, m_topoMinY, m_topoMaxX, m_topoMaxY); oss << GetXMLOpenClose_node (0,n->GetId (),v.x,v.y); oss << GetXMLClose ("topology"); - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); WriteDummyPacket (); } @@ -1163,7 +1079,7 @@ void AnimationInterface::MobilityAutoCheck () oss << GetXMLOpenClose_node (0, n->GetId (), v.x, v.y); } oss << GetXMLClose ("topology"); - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); WriteDummyPacket (); if (!Simulator::IsFinished ()) { @@ -1251,7 +1167,7 @@ void AnimationInterface::OutputWirelessPacket (Ptr p, AnimPacketIn oss << GetXMLOpenClose_meta (GetPacketMetadata (p)); oss << GetXMLClose ("wpacket"); - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); } void AnimationInterface::OutputCsmaPacket (Ptr p, AnimPacketInfo &pktInfo, AnimRxInfo pktrxInfo) @@ -1268,7 +1184,7 @@ void AnimationInterface::OutputCsmaPacket (Ptr p, AnimPacketInfo & if (m_enablePacketMetadata) oss << GetXMLOpenClose_meta (GetPacketMetadata (p)); oss << GetXMLClose ("packet"); - WriteN (m_fHandle, oss.str ()); + WriteN (oss.str ()); } void AnimationInterface::SetConstantPosition (Ptr n, double x, double y, double z) diff --git a/src/netanim/model/animation-interface.h b/src/netanim/model/animation-interface.h index f4338d4ca..9be26008f 100644 --- a/src/netanim/model/animation-interface.h +++ b/src/netanim/model/animation-interface.h @@ -35,21 +35,6 @@ #include "ns3/animation-interface-helper.h" #include "ns3/mac48-address.h" -#ifdef WIN32 -#include -#include -#define STDOUT_FILENO (SOCKET)GetStdHandle(STD_OUTPUT_HANDLE) -#define close _close -#define write _write -#undef GetObject -#undef min -#undef max -#define HANDLETYPE SOCKET -#else -#include "ns3/netanim-config.h" -#define HANDLETYPE int -#endif - namespace ns3 { #define MAX_PKTS_PER_TRACE_FILE 100000 @@ -72,18 +57,6 @@ class AnimationInterface { public: - /** - * \brief Construct the animator interface. No arguments needed. - * - */ - AnimationInterface (); - - /** - * \brief Destructor for the animator interface. - * - */ - ~AnimationInterface (); - /** * \brief Constructor * \param filename The Filename for the trace file used by the Animator @@ -99,13 +72,10 @@ public: bool usingXML = true); /** - * \brief Constructor - * \param port Port on which ns-3 should listen to for connection from the - * external netanim application - * \param usingXML Set to true if XML output traces are required + * \brief Destructor for the animator interface. * */ - AnimationInterface (uint16_t port, bool usingXML = true); + ~AnimationInterface (); /** * \brief Check if AnimationInterface is initialized @@ -154,21 +124,6 @@ public: */ void SetStopTime (Time t); - /** - * \brief (Deprecated) Specify that animation commands are to be written to - * a socket. - * - * This call is used to set the ns3 process in server mode, waiting - * for a TCP connection from the animator. This call will not - * return until the animator connects in, or if the bind to the - * specified port fails. - * - * \param port Port number to bind to. - * \returns true if connection created, false if bind failed. - * - */ - bool SetServerPort (uint16_t port); - /** * \brief Writes the topology information and sets up the appropriate * animation packet tx callback @@ -289,21 +244,13 @@ public: private: -#ifndef WIN32 - int m_fHandle; // File handle for output (-1 if none) + FILE * m_f; // File handle for output (-1 if none) // Write specified amount of data to the specified handle - int WriteN (int, const char*, uint32_t); -#else - SOCKET m_fHandle; // File handle for output (-1 if none) - int WriteN (SOCKET, const char*, uint32_t); -#endif + int WriteN (const char*, uint32_t); bool m_xml; // True if xml format desired Time m_mobilityPollInterval; - bool m_usingSockets; - uint16_t m_port; std::string m_outputFileName; bool m_outputFileSet; - bool m_serverPortSet; uint64_t gAnimUid ; // Packet unique identifier used by Animtion bool m_randomPosition; AnimWriteCallback m_writeCallback; @@ -360,7 +307,7 @@ private: void MobilityCourseChangeTrace (Ptr mob); // Write a string to the specified handle; - int WriteN (int, const std::string&); + int WriteN (const std::string&); void OutputWirelessPacket (Ptr p, AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo); void OutputCsmaPacket (Ptr p, AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo);