A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
udp-echo-server.cc
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright 2007 University of Washington
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  */
18 
19 #include "ns3/log.h"
20 #include "ns3/ipv4-address.h"
21 #include "ns3/ipv6-address.h"
22 #include "ns3/address-utils.h"
23 #include "ns3/nstime.h"
24 #include "ns3/inet-socket-address.h"
25 #include "ns3/inet6-socket-address.h"
26 #include "ns3/socket.h"
27 #include "ns3/udp-socket.h"
28 #include "ns3/simulator.h"
29 #include "ns3/socket-factory.h"
30 #include "ns3/packet.h"
31 #include "ns3/uinteger.h"
32 
33 #include "udp-echo-server.h"
34 
35 namespace ns3 {
36 
37 NS_LOG_COMPONENT_DEFINE ("UdpEchoServerApplication");
38 NS_OBJECT_ENSURE_REGISTERED (UdpEchoServer);
39 
40 TypeId
41 UdpEchoServer::GetTypeId (void)
42 {
43  static TypeId tid = TypeId ("ns3::UdpEchoServer")
44  .SetParent<Application> ()
45  .AddConstructor<UdpEchoServer> ()
46  .AddAttribute ("Port", "Port on which we listen for incoming packets.",
47  UintegerValue (9),
48  MakeUintegerAccessor (&UdpEchoServer::m_port),
49  MakeUintegerChecker<uint16_t> ())
50  ;
51  return tid;
52 }
53 
54 UdpEchoServer::UdpEchoServer ()
55 {
56  NS_LOG_FUNCTION (this);
57 }
58 
59 UdpEchoServer::~UdpEchoServer()
60 {
61  NS_LOG_FUNCTION (this);
62  m_socket = 0;
63  m_socket6 = 0;
64 }
65 
66 void
68 {
69  NS_LOG_FUNCTION (this);
71 }
72 
73 void
75 {
76  NS_LOG_FUNCTION (this);
77 
78  if (m_socket == 0)
79  {
80  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
81  m_socket = Socket::CreateSocket (GetNode (), tid);
83  m_socket->Bind (local);
84  if (addressUtils::IsMulticast (m_local))
85  {
86  Ptr<UdpSocket> udpSocket = DynamicCast<UdpSocket> (m_socket);
87  if (udpSocket)
88  {
89  // equivalent to setsockopt (MCAST_JOIN_GROUP)
90  udpSocket->MulticastJoinGroup (0, m_local);
91  }
92  else
93  {
94  NS_FATAL_ERROR ("Error: Failed to join multicast group");
95  }
96  }
97  }
98 
99  if (m_socket6 == 0)
100  {
101  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
102  m_socket6 = Socket::CreateSocket (GetNode (), tid);
104  m_socket6->Bind (local6);
105  if (addressUtils::IsMulticast (local6))
106  {
107  Ptr<UdpSocket> udpSocket = DynamicCast<UdpSocket> (m_socket6);
108  if (udpSocket)
109  {
110  // equivalent to setsockopt (MCAST_JOIN_GROUP)
111  udpSocket->MulticastJoinGroup (0, local6);
112  }
113  else
114  {
115  NS_FATAL_ERROR ("Error: Failed to join multicast group");
116  }
117  }
118  }
119 
120  m_socket->SetRecvCallback (MakeCallback (&UdpEchoServer::HandleRead, this));
121  m_socket6->SetRecvCallback (MakeCallback (&UdpEchoServer::HandleRead, this));
122 }
123 
124 void
126 {
127  NS_LOG_FUNCTION (this);
128 
129  if (m_socket != 0)
130  {
131  m_socket->Close ();
132  m_socket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
133  }
134  if (m_socket6 != 0)
135  {
136  m_socket6->Close ();
137  m_socket6->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
138  }
139 }
140 
141 void
142 UdpEchoServer::HandleRead (Ptr<Socket> socket)
143 {
144  NS_LOG_FUNCTION (this << socket);
145 
146  Ptr<Packet> packet;
147  Address from;
148  while ((packet = socket->RecvFrom (from)))
149  {
151  {
152  NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << "s server received " << packet->GetSize () << " bytes from " <<
153  InetSocketAddress::ConvertFrom (from).GetIpv4 () << " port " <<
155  }
156  else if (Inet6SocketAddress::IsMatchingType (from))
157  {
158  NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << "s server received " << packet->GetSize () << " bytes from " <<
159  Inet6SocketAddress::ConvertFrom (from).GetIpv6 () << " port " <<
161  }
162 
163  packet->RemoveAllPacketTags ();
164  packet->RemoveAllByteTags ();
165 
166  NS_LOG_LOGIC ("Echoing packet");
167  socket->SendTo (packet, 0, from);
168 
170  {
171  NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << "s server sent " << packet->GetSize () << " bytes to " <<
172  InetSocketAddress::ConvertFrom (from).GetIpv4 () << " port " <<
174  }
175  else if (Inet6SocketAddress::IsMatchingType (from))
176  {
177  NS_LOG_INFO ("At time " << Simulator::Now ().GetSeconds () << "s server sent " << packet->GetSize () << " bytes to " <<
178  Inet6SocketAddress::ConvertFrom (from).GetIpv6 () << " port " <<
180  }
181  }
182 }
183 
184 } // Namespace ns3
Ipv6Address GetIpv6(void) const
Get the IPv6 address.
an Inet address class
Ipv4Address GetIpv4(void) const
static Ipv4Address GetAny(void)
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:311
virtual void StartApplication(void)
Application specific startup code.
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
#define NS_LOG_COMPONENT_DEFINE(name)
Definition: log.h:122
uint32_t GetSize(void) const
Definition: packet.h:620
#define NS_LOG_INFO(msg)
Definition: log.h:264
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:72
a polymophic address class
Definition: address.h:86
void RemoveAllPacketTags(void)
Definition: packet.cc:888
Ptr< Node > GetNode() const
Definition: application.cc:103
An Inet6 address class.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:502
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
Definition: socket.cc:127
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
Definition: socket.cc:70
virtual void DoDispose(void)
#define NS_LOG_LOGIC(msg)
Definition: log.h:334
virtual void DoDispose(void)
Definition: application.cc:82
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
static InetSocketAddress ConvertFrom(const Address &address)
Callback< R > MakeNullCallback(void)
Definition: callback.h:781
static Time Now(void)
Definition: simulator.cc:179
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
void RemoveAllByteTags(void)
Definition: packet.cc:378
static bool IsMatchingType(const Address &addr)
If the address match.
uint16_t GetPort(void) const
Get the port.
virtual void StopApplication(void)
Application specific shutdown code.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
uint16_t GetPort(void) const
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
virtual int Close(void)=0
Close a socket.
a unique identifier for an interface.
Definition: type-id.h:44
static bool IsMatchingType(const Address &address)
static TypeId LookupByName(std::string name)
Definition: type-id.cc:415