A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
udp-echo-client.cc
Go to the documentation of this file.
1/*
2 * Copyright 2007 University of Washington
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6#include "udp-echo-client.h"
7
8#include "ns3/inet-socket-address.h"
9#include "ns3/inet6-socket-address.h"
10#include "ns3/ipv4-address.h"
11#include "ns3/ipv6-address.h"
12#include "ns3/log.h"
13#include "ns3/nstime.h"
14#include "ns3/packet.h"
15#include "ns3/simulator.h"
16#include "ns3/socket-factory.h"
17#include "ns3/socket.h"
18#include "ns3/trace-source-accessor.h"
19#include "ns3/uinteger.h"
20
21namespace ns3
22{
23
24NS_LOG_COMPONENT_DEFINE("UdpEchoClientApplication");
25
26NS_OBJECT_ENSURE_REGISTERED(UdpEchoClient);
27
28TypeId
30{
31 static TypeId tid =
32 TypeId("ns3::UdpEchoClient")
34 .SetGroupName("Applications")
35 .AddConstructor<UdpEchoClient>()
36 .AddAttribute(
37 "MaxPackets",
38 "The maximum number of packets the application will send (zero means infinite)",
39 UintegerValue(100),
42 .AddAttribute("Interval",
43 "The time to wait between packets",
44 TimeValue(Seconds(1.0)),
47 .AddAttribute("RemoteAddress",
48 "The destination Address of the outbound packets",
52 .AddAttribute("RemotePort",
53 "The destination port of the outbound packets",
57 .AddAttribute("Tos",
58 "The Type of Service used to send IPv4 packets. "
59 "All 8 bits of the TOS byte are set (including ECN bits).",
63 .AddAttribute(
64 "PacketSize",
65 "Size of echo data in outbound packets",
66 UintegerValue(100),
69 .AddTraceSource("Tx",
70 "A new packet is created and is sent",
72 "ns3::Packet::TracedCallback")
73 .AddTraceSource("Rx",
74 "A packet has been received",
76 "ns3::Packet::TracedCallback")
77 .AddTraceSource("TxWithAddresses",
78 "A new packet is created and is sent",
80 "ns3::Packet::TwoAddressTracedCallback")
81 .AddTraceSource("RxWithAddresses",
82 "A packet has been received",
84 "ns3::Packet::TwoAddressTracedCallback");
85 return tid;
86}
87
89{
90 NS_LOG_FUNCTION(this);
91 m_sent = 0;
92 m_socket = nullptr;
94 m_data = nullptr;
95 m_dataSize = 0;
96}
97
99{
100 NS_LOG_FUNCTION(this);
101 m_socket = nullptr;
102
103 delete[] m_data;
104 m_data = nullptr;
105 m_dataSize = 0;
106}
107
108void
110{
111 NS_LOG_FUNCTION(this << ip << port);
112 m_peerAddress = ip;
114}
115
116void
118{
119 NS_LOG_FUNCTION(this << addr);
120 m_peerAddress = addr;
121}
122
123void
125{
126 NS_LOG_FUNCTION(this);
127
128 if (!m_socket)
129 {
130 TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
132 NS_ABORT_MSG_IF(m_peerAddress.IsInvalid(), "'RemoteAddress' attribute not properly set");
134 {
135 if (m_socket->Bind() == -1)
136 {
137 NS_FATAL_ERROR("Failed to bind socket");
138 }
139 m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
142 }
144 {
145 if (m_socket->Bind6() == -1)
146 {
147 NS_FATAL_ERROR("Failed to bind socket");
148 }
151 }
153 {
154 if (m_socket->Bind() == -1)
155 {
156 NS_FATAL_ERROR("Failed to bind socket");
157 }
158 m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
160 }
162 {
163 if (m_socket->Bind6() == -1)
164 {
165 NS_FATAL_ERROR("Failed to bind socket");
166 }
168 }
169 else
170 {
171 NS_ASSERT_MSG(false, "Incompatible address type: " << m_peerAddress);
172 }
173 }
174
178}
179
180void
182{
183 NS_LOG_FUNCTION(this);
184
185 if (m_socket)
186 {
187 m_socket->Close();
189 m_socket = nullptr;
190 }
191
193}
194
195void
197{
198 NS_LOG_FUNCTION(this << dataSize);
199
200 //
201 // If the client is setting the echo packet data size this way, we infer
202 // that she doesn't care about the contents of the packet at all, so
203 // neither will we.
204 //
205 delete[] m_data;
206 m_data = nullptr;
207 m_dataSize = 0;
208 m_size = dataSize;
209}
210
213{
214 NS_LOG_FUNCTION(this);
215 return m_size;
216}
217
218void
219UdpEchoClient::SetFill(std::string fill)
220{
221 NS_LOG_FUNCTION(this << fill);
222
223 uint32_t dataSize = fill.size() + 1;
224
225 if (dataSize != m_dataSize)
226 {
227 delete[] m_data;
228 m_data = new uint8_t[dataSize];
229 m_dataSize = dataSize;
230 }
231
232 memcpy(m_data, fill.c_str(), dataSize);
233
234 //
235 // Overwrite packet size attribute.
236 //
237 m_size = dataSize;
238}
239
240void
241UdpEchoClient::SetFill(uint8_t fill, uint32_t dataSize)
242{
243 NS_LOG_FUNCTION(this << fill << dataSize);
244 if (dataSize != m_dataSize)
245 {
246 delete[] m_data;
247 m_data = new uint8_t[dataSize];
248 m_dataSize = dataSize;
249 }
250
251 memset(m_data, fill, dataSize);
252
253 //
254 // Overwrite packet size attribute.
255 //
256 m_size = dataSize;
257}
258
259void
260UdpEchoClient::SetFill(uint8_t* fill, uint32_t fillSize, uint32_t dataSize)
261{
262 NS_LOG_FUNCTION(this << fill << fillSize << dataSize);
263 if (dataSize != m_dataSize)
264 {
265 delete[] m_data;
266 m_data = new uint8_t[dataSize];
267 m_dataSize = dataSize;
268 }
269
270 if (fillSize >= dataSize)
271 {
272 memcpy(m_data, fill, dataSize);
273 m_size = dataSize;
274 return;
275 }
276
277 //
278 // Do all but the final fill.
279 //
280 uint32_t filled = 0;
281 while (filled + fillSize < dataSize)
282 {
283 memcpy(&m_data[filled], fill, fillSize);
284 filled += fillSize;
285 }
286
287 //
288 // Last fill may be partial
289 //
290 memcpy(&m_data[filled], fill, dataSize - filled);
291
292 //
293 // Overwrite packet size attribute.
294 //
295 m_size = dataSize;
296}
297
298void
304
305void
307{
308 NS_LOG_FUNCTION(this);
309
311
312 Ptr<Packet> p;
313 if (m_dataSize)
314 {
315 //
316 // If m_dataSize is non-zero, we have a data buffer of the same size that we
317 // are expected to copy and send. This state of affairs is created if one of
318 // the Fill functions is called. In this case, m_size must have been set
319 // to agree with m_dataSize
320 //
322 "UdpEchoClient::Send(): m_size and m_dataSize inconsistent");
323 NS_ASSERT_MSG(m_data, "UdpEchoClient::Send(): m_dataSize but no m_data");
325 }
326 else
327 {
328 //
329 // If m_dataSize is zero, the client has indicated that it doesn't care
330 // about the data itself either by specifying the data size by setting
331 // the corresponding attribute or by not calling a SetFill function. In
332 // this case, we don't worry about it either. But we do allow m_size
333 // to have a value different from the (zero) m_dataSize.
334 //
336 }
337 Address localAddress;
338 m_socket->GetSockName(localAddress);
339 // call to the trace sinks before the packet is actually sent,
340 // so that tags added to the packet can be sent as well
341 m_txTrace(p);
343 {
345 p,
346 localAddress,
348 }
350 {
352 p,
353 localAddress,
355 }
356 m_socket->Send(p);
357 ++m_sent;
358
360 {
361 NS_LOG_INFO("At time " << Simulator::Now().As(Time::S) << " client sent " << m_size
362 << " bytes to " << Ipv4Address::ConvertFrom(m_peerAddress)
363 << " port " << m_peerPort);
364 }
366 {
367 NS_LOG_INFO("At time " << Simulator::Now().As(Time::S) << " client sent " << m_size
368 << " bytes to " << Ipv6Address::ConvertFrom(m_peerAddress)
369 << " port " << m_peerPort);
370 }
372 {
374 "At time " << Simulator::Now().As(Time::S) << " client sent " << m_size << " bytes to "
375 << InetSocketAddress::ConvertFrom(m_peerAddress).GetIpv4() << " port "
377 }
379 {
381 "At time " << Simulator::Now().As(Time::S) << " client sent " << m_size << " bytes to "
382 << Inet6SocketAddress::ConvertFrom(m_peerAddress).GetIpv6() << " port "
384 }
385
386 if (m_sent < m_count || m_count == 0)
387 {
389 }
390}
391
392void
394{
395 NS_LOG_FUNCTION(this << socket);
396 Ptr<Packet> packet;
397 Address from;
398 Address localAddress;
399 while ((packet = socket->RecvFrom(from)))
400 {
402 {
403 NS_LOG_INFO("At time " << Simulator::Now().As(Time::S) << " client received "
404 << packet->GetSize() << " bytes from "
405 << InetSocketAddress::ConvertFrom(from).GetIpv4() << " port "
407 }
409 {
410 NS_LOG_INFO("At time " << Simulator::Now().As(Time::S) << " client received "
411 << packet->GetSize() << " bytes from "
412 << Inet6SocketAddress::ConvertFrom(from).GetIpv6() << " port "
414 }
415 socket->GetSockName(localAddress);
416 m_rxTrace(packet);
417 m_rxTraceWithAddresses(packet, from, localAddress);
418 }
419}
420
421} // Namespace ns3
a polymophic address class
Definition address.h:90
bool IsInvalid() const
Definition address.cc:60
The base class for all ns3 applications.
Definition application.h:51
Ptr< Node > GetNode() const
An identifier for simulation events.
Definition event-id.h:45
bool IsExpired() const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
Definition event-id.cc:58
An Inet6 address class.
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
uint16_t GetPort() const
Get the port.
static bool IsMatchingType(const Address &addr)
If the address match.
Ipv6Address GetIpv6() const
Get the IPv6 address.
an Inet address class
static bool IsMatchingType(const Address &address)
Ipv4Address GetIpv4() const
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
static Ipv4Address ConvertFrom(const Address &address)
static bool IsMatchingType(const Address &address)
static Ipv6Address ConvertFrom(const Address &address)
Convert the Address object into an Ipv6Address ones.
static bool IsMatchingType(const Address &address)
If the Address matches the type.
Smart pointer class similar to boost::intrusive_ptr.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition simulator.h:560
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
Definition simulator.cc:274
static Time Now()
Return the current simulation virtual time.
Definition simulator.cc:197
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
void SetIpTos(uint8_t ipTos)
Manually set IP Type of Service field.
Definition socket.cc:423
virtual bool SetAllowBroadcast(bool allowBroadcast)=0
Configure whether broadcast datagram transmissions are allowed.
virtual int Bind6()=0
Allocate a local IPv6 endpoint for this socket.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
virtual int GetSockName(Address &address) const =0
Get socket address.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
Definition socket.cc:117
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
Definition socket.cc:61
virtual int Close()=0
Close a socket.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
@ S
second
Definition nstime.h:105
a unique identifier for an interface.
Definition type-id.h:48
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition type-id.cc:872
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition type-id.cc:1001
A Udp Echo client.
void SetFill(std::string fill)
Set the data fill of the packet (what is sent as data to the server) to the zero-terminated contents ...
Time m_interval
Packet inter-send time.
void Send()
Send a packet.
void StopApplication() override
Application specific shutdown code.
Ptr< Socket > m_socket
Socket.
void HandleRead(Ptr< Socket > socket)
Handle a packet reception.
EventId m_sendEvent
Event to send the next packet.
uint32_t m_size
Size of the sent packet.
uint8_t m_tos
The packets Type of Service.
uint32_t GetDataSize() const
Get the number of data bytes that will be sent to the server.
uint32_t m_count
Maximum number of packets the application will send.
static TypeId GetTypeId()
Get the type ID.
Address m_peerAddress
Remote peer address.
uint8_t * m_data
packet payload data
uint32_t m_sent
Counter for sent packets.
void StartApplication() override
Application specific startup code.
void ScheduleTransmit(Time dt)
Schedule the next packet transmission.
TracedCallback< Ptr< const Packet >, const Address &, const Address & > m_txTraceWithAddresses
Callbacks for tracing the packet Tx events, includes source and destination addresses.
TracedCallback< Ptr< const Packet > > m_txTrace
Callbacks for tracing the packet Tx events.
TracedCallback< Ptr< const Packet >, const Address &, const Address & > m_rxTraceWithAddresses
Callbacks for tracing the packet Rx events, includes source and destination addresses.
void SetDataSize(uint32_t dataSize)
Set the data size of the packet (the number of bytes that are sent as data to the server).
uint16_t m_peerPort
Remote peer port.
TracedCallback< Ptr< const Packet > > m_rxTrace
Callbacks for tracing the packet Rx events.
uint32_t m_dataSize
packet payload size (must be equal to m_size)
void SetRemote(Address ip, uint16_t port)
set the remote address and port
Hold an unsigned integer type.
Definition uinteger.h:34
uint16_t port
Definition dsdv-manet.cc:33
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition assert.h:55
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition assert.h:75
Callback< R, Args... > MakeNullCallback()
Definition callback.h:727
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition abort.h:97
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition log.h:264
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition object-base.h:35
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeUintegerChecker()
Definition uinteger.h:85
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Definition nstime.h:1396
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition callback.h:684
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Definition uinteger.h:35
Ptr< const AttributeChecker > MakeAddressChecker()
Definition address.cc:169
Ptr< const AttributeAccessor > MakeAddressAccessor(T1 a1)
Definition address.h:275
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Definition nstime.h:1416