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 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Amine Ismail <amine.ismail@sophia.inria.fr>
18 * <amine.ismail@udcast.com>
19 */
20#include "udp-client.h"
21
22#include "seq-ts-header.h"
23
24#include "ns3/inet-socket-address.h"
25#include "ns3/inet6-socket-address.h"
26#include "ns3/ipv4-address.h"
27#include "ns3/log.h"
28#include "ns3/nstime.h"
29#include "ns3/packet.h"
30#include "ns3/simulator.h"
31#include "ns3/socket-factory.h"
32#include "ns3/socket.h"
33#include "ns3/uinteger.h"
34
35#include <cstdio>
36#include <cstdlib>
37
38namespace ns3
39{
40
41NS_LOG_COMPONENT_DEFINE("UdpClient");
42
44
45TypeId
47{
48 static TypeId tid =
49 TypeId("ns3::UdpClient")
51 .SetGroupName("Applications")
52 .AddConstructor<UdpClient>()
53 .AddAttribute(
54 "MaxPackets",
55 "The maximum number of packets the application will send (zero means infinite)",
56 UintegerValue(100),
58 MakeUintegerChecker<uint32_t>())
59 .AddAttribute("Interval",
60 "The time to wait between packets",
61 TimeValue(Seconds(1.0)),
64 .AddAttribute("RemoteAddress",
65 "The destination Address of the outbound packets",
69 .AddAttribute("RemotePort",
70 "The destination port of the outbound packets",
71 UintegerValue(100),
73 MakeUintegerChecker<uint16_t>())
74 .AddAttribute("Tos",
75 "The Type of Service used to send IPv4 packets. "
76 "All 8 bits of the TOS byte are set (including ECN bits).",
79 MakeUintegerChecker<uint8_t>())
80 .AddAttribute("PacketSize",
81 "Size of packets generated. The minimum packet size is 12 bytes which is "
82 "the size of the header carrying the sequence number and the time stamp.",
83 UintegerValue(1024),
85 MakeUintegerChecker<uint32_t>(12, 65507))
86 .AddTraceSource("Tx",
87 "A new packet is created and sent",
89 "ns3::Packet::TracedCallback")
90 .AddTraceSource("TxWithAddresses",
91 "A new packet is created and sent",
93 "ns3::Packet::TwoAddressTracedCallback");
94 return tid;
95}
96
98{
99 NS_LOG_FUNCTION(this);
100 m_sent = 0;
101 m_totalTx = 0;
102 m_socket = nullptr;
104}
105
107{
108 NS_LOG_FUNCTION(this);
109}
110
111void
113{
114 NS_LOG_FUNCTION(this << ip << port);
115 m_peerAddress = ip;
117}
118
119void
121{
122 NS_LOG_FUNCTION(this << addr);
123 m_peerAddress = addr;
124}
125
126void
128{
129 NS_LOG_FUNCTION(this);
130
131 if (!m_socket)
132 {
133 TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
136 {
137 if (m_socket->Bind() == -1)
138 {
139 NS_FATAL_ERROR("Failed to bind socket");
140 }
141 m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
144 }
146 {
147 if (m_socket->Bind6() == -1)
148 {
149 NS_FATAL_ERROR("Failed to bind socket");
150 }
153 }
155 {
156 if (m_socket->Bind() == -1)
157 {
158 NS_FATAL_ERROR("Failed to bind socket");
159 }
160 m_socket->SetIpTos(m_tos); // Affects only IPv4 sockets.
162 }
164 {
165 if (m_socket->Bind6() == -1)
166 {
167 NS_FATAL_ERROR("Failed to bind socket");
168 }
170 }
171 else
172 {
173 NS_ASSERT_MSG(false, "Incompatible address type: " << m_peerAddress);
174 }
175 }
176
177#ifdef NS3_LOG_ENABLE
178 std::stringstream peerAddressStringStream;
180 {
181 peerAddressStringStream << Ipv4Address::ConvertFrom(m_peerAddress);
182 }
184 {
185 peerAddressStringStream << Ipv6Address::ConvertFrom(m_peerAddress);
186 }
188 {
189 peerAddressStringStream << InetSocketAddress::ConvertFrom(m_peerAddress).GetIpv4();
190 }
192 {
193 peerAddressStringStream << Inet6SocketAddress::ConvertFrom(m_peerAddress).GetIpv6();
194 }
195 m_peerAddressString = peerAddressStringStream.str();
196#endif // NS3_LOG_ENABLE
197
201}
202
203void
205{
206 NS_LOG_FUNCTION(this);
208}
209
210void
212{
213 NS_LOG_FUNCTION(this);
215
216 Address from;
217 Address to;
218 m_socket->GetSockName(from);
220 SeqTsHeader seqTs;
221 seqTs.SetSeq(m_sent);
223 Ptr<Packet> p = Create<Packet>(m_size - seqTs.GetSerializedSize());
224
225 // Trace before adding header, for consistency with PacketSink
226 m_txTrace(p);
227 m_txTraceWithAddresses(p, from, to);
228
229 p->AddHeader(seqTs);
230
231 if ((m_socket->Send(p)) >= 0)
232 {
233 ++m_sent;
234 m_totalTx += p->GetSize();
235#ifdef NS3_LOG_ENABLE
236 NS_LOG_INFO("TraceDelay TX " << m_size << " bytes to " << m_peerAddressString << " Uid: "
237 << p->GetUid() << " Time: " << (Simulator::Now()).As(Time::S));
238#endif // NS3_LOG_ENABLE
239 }
240#ifdef NS3_LOG_ENABLE
241 else
242 {
243 NS_LOG_INFO("Error while sending " << m_size << " bytes to " << m_peerAddressString);
244 }
245#endif // NS3_LOG_ENABLE
246
247 if (m_sent < m_count || m_count == 0)
248 {
250 }
251}
252
253uint64_t
255{
256 return m_totalTx;
257}
258
259} // Namespace ns3
a polymophic address class
Definition: address.h:101
AttributeValue implementation for Address.
Definition: address.h:286
The base class for all ns3 applications.
Definition: application.h:62
Ptr< Node > GetNode() const
Definition: application.cc:108
An identifier for simulation events.
Definition: event-id.h:55
bool IsExpired() const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
Definition: event-id.cc:69
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.
Definition: ptr.h:77
Packet header to carry sequence number and timestamp.
Definition: seq-ts-header.h:45
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:571
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:285
static Time Now()
Return the current simulation virtual time.
Definition: simulator.cc:208
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:434
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:128
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:72
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
@ S
second
Definition: nstime.h:116
AttributeValue implementation for Time.
Definition: nstime.h:1413
a unique identifier for an interface.
Definition: type-id.h:59
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition: type-id.cc:836
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:932
A Udp client.
Definition: udp-client.h:45
Time m_interval
Packet inter-send time.
Definition: udp-client.h:90
uint64_t GetTotalTx() const
Definition: udp-client.cc:254
uint64_t m_totalTx
Total bytes sent.
Definition: udp-client.h:94
~UdpClient() override
Definition: udp-client.cc:106
uint32_t m_sent
Counter for sent packets.
Definition: udp-client.h:93
Ptr< Socket > m_socket
Socket.
Definition: udp-client.h:95
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:87
uint16_t m_peerPort
Remote peer port.
Definition: udp-client.h:97
void Send()
Send a packet.
Definition: udp-client.cc:211
static TypeId GetTypeId()
Get the type ID.
Definition: udp-client.cc:46
EventId m_sendEvent
Event to send the next packet.
Definition: udp-client.h:99
uint32_t m_size
Size of the sent packet (including the SeqTsHeader)
Definition: udp-client.h:91
uint32_t m_count
Maximum number of packets the application will send.
Definition: udp-client.h:89
void SetRemote(Address ip, uint16_t port)
set the remote address and port
Definition: udp-client.cc:112
Address m_peerAddress
Remote peer address.
Definition: udp-client.h:96
TracedCallback< Ptr< const Packet > > m_txTrace
Traced Callback: transmitted packets.
Definition: udp-client.h:84
uint8_t m_tos
The packets Type of Service.
Definition: udp-client.h:98
void StartApplication() override
Application specific startup code.
Definition: udp-client.cc:127
void StopApplication() override
Application specific shutdown code.
Definition: udp-client.cc:204
std::string m_peerAddressString
Remote peer address string.
Definition: udp-client.h:102
Hold an unsigned integer type.
Definition: uinteger.h:45
uint16_t port
Definition: dsdv-manet.cc:44
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:66
#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:86
Ptr< const AttributeChecker > MakeAddressChecker()
Definition: address.cc:180
Ptr< const AttributeAccessor > MakeAddressAccessor(T1 a1)
Definition: address.h:286
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Definition: nstime.h:1434
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Definition: nstime.h:1414
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Definition: uinteger.h:46
Callback< R, Args... > MakeNullCallback()
Definition: callback.h:747
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
Definition: abort.h:76
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#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:275
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:46
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
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.