A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
udp-client.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2007,2008,2009 INRIA, UDCAST
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Amine Ismail <amine.ismail@sophia.inria.fr>
7 * <amine.ismail@udcast.com>
8 */
9#include "udp-client.h"
10
11#include "seq-ts-header.h"
12
13#include "ns3/inet-socket-address.h"
14#include "ns3/inet6-socket-address.h"
15#include "ns3/ipv4-address.h"
16#include "ns3/log.h"
17#include "ns3/nstime.h"
18#include "ns3/packet.h"
19#include "ns3/simulator.h"
20#include "ns3/socket-factory.h"
21#include "ns3/socket.h"
22#include "ns3/uinteger.h"
23
24#include <cstdio>
25#include <cstdlib>
26
27namespace ns3
28{
29
30NS_LOG_COMPONENT_DEFINE("UdpClient");
31
33
34TypeId
36{
37 static TypeId tid =
38 TypeId("ns3::UdpClient")
40 .SetGroupName("Applications")
41 .AddConstructor<UdpClient>()
42 .AddAttribute(
43 "MaxPackets",
44 "The maximum number of packets the application will send (zero means infinite)",
45 UintegerValue(100),
48 .AddAttribute("Interval",
49 "The time to wait between packets",
50 TimeValue(Seconds(1.0)),
53 .AddAttribute("RemoteAddress",
54 "The destination Address of the outbound packets",
58 .AddAttribute("RemotePort",
59 "The destination port of the outbound packets",
60 UintegerValue(100),
63 .AddAttribute("Tos",
64 "The Type of Service used to send IPv4 packets. "
65 "All 8 bits of the TOS byte are set (including ECN bits).",
69 .AddAttribute("PacketSize",
70 "Size of packets generated. The minimum packet size is 12 bytes which is "
71 "the size of the header carrying the sequence number and the time stamp.",
72 UintegerValue(1024),
75 .AddTraceSource("Tx",
76 "A new packet is created and sent",
78 "ns3::Packet::TracedCallback")
79 .AddTraceSource("TxWithAddresses",
80 "A new packet is created and sent",
82 "ns3::Packet::TwoAddressTracedCallback");
83 return tid;
84}
85
87{
88 NS_LOG_FUNCTION(this);
89 m_sent = 0;
90 m_totalTx = 0;
91 m_socket = nullptr;
93}
94
99
100void
102{
103 NS_LOG_FUNCTION(this << ip << port);
104 m_peerAddress = ip;
106}
107
108void
110{
111 NS_LOG_FUNCTION(this << addr);
112 m_peerAddress = addr;
113}
114
115void
117{
118 NS_LOG_FUNCTION(this);
119
120 if (!m_socket)
121 {
122 TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
125 {
126 if (m_socket->Bind() == -1)
127 {
128 NS_FATAL_ERROR("Failed to bind socket");
129 }
130 m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
133 }
135 {
136 if (m_socket->Bind6() == -1)
137 {
138 NS_FATAL_ERROR("Failed to bind socket");
139 }
142 }
144 {
145 if (m_socket->Bind() == -1)
146 {
147 NS_FATAL_ERROR("Failed to bind socket");
148 }
149 m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
151 }
153 {
154 if (m_socket->Bind6() == -1)
155 {
156 NS_FATAL_ERROR("Failed to bind socket");
157 }
159 }
160 else
161 {
162 NS_ASSERT_MSG(false, "Incompatible address type: " << m_peerAddress);
163 }
164 }
165
166#ifdef NS3_LOG_ENABLE
167 std::stringstream peerAddressStringStream;
169 {
170 peerAddressStringStream << Ipv4Address::ConvertFrom(m_peerAddress);
171 }
173 {
174 peerAddressStringStream << Ipv6Address::ConvertFrom(m_peerAddress);
175 }
177 {
178 peerAddressStringStream << InetSocketAddress::ConvertFrom(m_peerAddress).GetIpv4();
179 }
181 {
182 peerAddressStringStream << Inet6SocketAddress::ConvertFrom(m_peerAddress).GetIpv6();
183 }
184 m_peerAddressString = peerAddressStringStream.str();
185#endif // NS3_LOG_ENABLE
186
190}
191
192void
198
199void
201{
202 NS_LOG_FUNCTION(this);
204
205 Address from;
206 Address to;
207 m_socket->GetSockName(from);
209 SeqTsHeader seqTs;
210 seqTs.SetSeq(m_sent);
213
214 // Trace before adding header, for consistency with PacketSink
215 m_txTrace(p);
216 m_txTraceWithAddresses(p, from, to);
217
218 p->AddHeader(seqTs);
219
220 if ((m_socket->Send(p)) >= 0)
221 {
222 ++m_sent;
223 m_totalTx += p->GetSize();
224#ifdef NS3_LOG_ENABLE
225 NS_LOG_INFO("TraceDelay TX " << m_size << " bytes to " << m_peerAddressString << " Uid: "
226 << p->GetUid() << " Time: " << (Simulator::Now()).As(Time::S));
227#endif // NS3_LOG_ENABLE
228 }
229#ifdef NS3_LOG_ENABLE
230 else
231 {
232 NS_LOG_INFO("Error while sending " << m_size << " bytes to " << m_peerAddressString);
233 }
234#endif // NS3_LOG_ENABLE
235
236 if (m_sent < m_count || m_count == 0)
237 {
239 }
240}
241
242uint64_t
244{
245 return m_totalTx;
246}
247
248} // Namespace ns3
a polymophic address class
Definition address.h:90
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.
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.
Packet header to carry sequence number and timestamp.
void SetSeq(uint32_t seq)
uint32_t GetSerializedSize() const override
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 GetPeerName(Address &address) const =0
Get the peer address of a connected 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 Bind(const Address &address)=0
Allocate a local endpoint for this socket.
@ 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 client.
Definition udp-client.h:34
Time m_interval
Packet inter-send time.
Definition udp-client.h:79
uint64_t GetTotalTx() const
uint64_t m_totalTx
Total bytes sent.
Definition udp-client.h:83
~UdpClient() override
Definition udp-client.cc:95
uint32_t m_sent
Counter for sent packets.
Definition udp-client.h:82
Ptr< Socket > m_socket
Socket.
Definition udp-client.h:84
TracedCallback< Ptr< const Packet >, const Address &, const Address & > m_txTraceWithAddresses
Callbacks for tracing the packet Tx events, includes source and destination addresses.
Definition udp-client.h:76
uint16_t m_peerPort
Remote peer port.
Definition udp-client.h:86
void Send()
Send a packet.
static TypeId GetTypeId()
Get the type ID.
Definition udp-client.cc:35
EventId m_sendEvent
Event to send the next packet.
Definition udp-client.h:88
uint32_t m_size
Size of the sent packet (including the SeqTsHeader)
Definition udp-client.h:80
uint32_t m_count
Maximum number of packets the application will send.
Definition udp-client.h:78
void SetRemote(Address ip, uint16_t port)
set the remote address and port
Address m_peerAddress
Remote peer address.
Definition udp-client.h:85
TracedCallback< Ptr< const Packet > > m_txTrace
Traced Callback: transmitted packets.
Definition udp-client.h:73
uint8_t m_tos
The packets Type of Service.
Definition udp-client.h:87
void StartApplication() override
Application specific startup code.
void StopApplication() override
Application specific shutdown code.
std::string m_peerAddressString
Remote peer address string.
Definition udp-client.h:91
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_IF(cond)
Abnormal program termination if a condition is true.
Definition abort.h:65
#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
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