A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
udp-client.cc
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2007,2008,2009 INRIA, UDCAST
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
* Author: Amine Ismail <amine.ismail@sophia.inria.fr>
19
* <amine.ismail@udcast.com>
20
*/
21
#include "ns3/log.h"
22
#include "ns3/ipv4-address.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/simulator.h"
28
#include "ns3/socket-factory.h"
29
#include "ns3/packet.h"
30
#include "ns3/uinteger.h"
31
#include "
udp-client.h
"
32
#include "
seq-ts-header.h
"
33
#include <cstdlib>
34
#include <cstdio>
35
36
namespace
ns3 {
37
38
NS_LOG_COMPONENT_DEFINE
(
"UdpClient"
);
39
NS_OBJECT_ENSURE_REGISTERED
(UdpClient);
40
41
TypeId
42
UdpClient::GetTypeId
(
void
)
43
{
44
static
TypeId
tid =
TypeId
(
"ns3::UdpClient"
)
45
.
SetParent
<
Application
> ()
46
.AddConstructor<UdpClient> ()
47
.AddAttribute (
"MaxPackets"
,
48
"The maximum number of packets the application will send"
,
49
UintegerValue
(100),
50
MakeUintegerAccessor (&
UdpClient::m_count
),
51
MakeUintegerChecker<uint32_t> ())
52
.AddAttribute (
"Interval"
,
53
"The time to wait between packets"
,
TimeValue
(
Seconds
(1.0)),
54
MakeTimeAccessor (&
UdpClient::m_interval
),
55
MakeTimeChecker ())
56
.AddAttribute (
57
"RemoteAddress"
,
58
"The destination Address of the outbound packets"
,
59
AddressValue
(),
60
MakeAddressAccessor (&
UdpClient::m_peerAddress
),
61
MakeAddressChecker ())
62
.AddAttribute (
"RemotePort"
,
"The destination port of the outbound packets"
,
63
UintegerValue
(100),
64
MakeUintegerAccessor (&
UdpClient::m_peerPort
),
65
MakeUintegerChecker<uint16_t> ())
66
.AddAttribute (
"PacketSize"
,
67
"Size of packets generated. The minimum packet size is 12 bytes which is the size of the header carrying the sequence number and the time stamp."
,
68
UintegerValue
(1024),
69
MakeUintegerAccessor (&
UdpClient::m_size
),
70
MakeUintegerChecker<uint32_t> (12,1500))
71
;
72
return
tid;
73
}
74
75
UdpClient::UdpClient
()
76
{
77
NS_LOG_FUNCTION
(
this
);
78
m_sent
= 0;
79
m_socket
= 0;
80
m_sendEvent
=
EventId
();
81
}
82
83
UdpClient::~UdpClient
()
84
{
85
NS_LOG_FUNCTION
(
this
);
86
}
87
88
void
89
UdpClient::SetRemote
(
Ipv4Address
ip, uint16_t
port
)
90
{
91
NS_LOG_FUNCTION
(
this
<< ip << port);
92
m_peerAddress
=
Address
(ip);
93
m_peerPort
=
port
;
94
}
95
96
void
97
UdpClient::SetRemote
(
Ipv6Address
ip, uint16_t
port
)
98
{
99
NS_LOG_FUNCTION
(
this
<< ip << port);
100
m_peerAddress
=
Address
(ip);
101
m_peerPort
=
port
;
102
}
103
104
void
105
UdpClient::SetRemote
(
Address
ip, uint16_t
port
)
106
{
107
NS_LOG_FUNCTION
(
this
<< ip << port);
108
m_peerAddress
= ip;
109
m_peerPort
=
port
;
110
}
111
112
void
113
UdpClient::DoDispose
(
void
)
114
{
115
NS_LOG_FUNCTION
(
this
);
116
Application::DoDispose
();
117
}
118
119
void
120
UdpClient::StartApplication
(
void
)
121
{
122
NS_LOG_FUNCTION
(
this
);
123
124
if
(
m_socket
== 0)
125
{
126
TypeId
tid =
TypeId::LookupByName
(
"ns3::UdpSocketFactory"
);
127
m_socket
=
Socket::CreateSocket
(
GetNode
(), tid);
128
if
(
Ipv4Address::IsMatchingType
(
m_peerAddress
) ==
true
)
129
{
130
m_socket
->
Bind
();
131
m_socket
->
Connect
(
InetSocketAddress
(
Ipv4Address::ConvertFrom
(
m_peerAddress
),
m_peerPort
));
132
}
133
else
if
(
Ipv6Address::IsMatchingType
(
m_peerAddress
) ==
true
)
134
{
135
m_socket
->
Bind6
();
136
m_socket
->
Connect
(
Inet6SocketAddress
(
Ipv6Address::ConvertFrom
(
m_peerAddress
),
m_peerPort
));
137
}
138
}
139
140
m_socket
->
SetRecvCallback
(
MakeNullCallback
<
void
,
Ptr<Socket>
> ());
141
m_sendEvent
=
Simulator::Schedule
(
Seconds
(0.0), &
UdpClient::Send
,
this
);
142
}
143
144
void
145
UdpClient::StopApplication
(
void
)
146
{
147
NS_LOG_FUNCTION
(
this
);
148
Simulator::Cancel
(
m_sendEvent
);
149
}
150
151
void
152
UdpClient::Send
(
void
)
153
{
154
NS_LOG_FUNCTION
(
this
);
155
NS_ASSERT
(
m_sendEvent
.
IsExpired
());
156
SeqTsHeader
seqTs;
157
seqTs.
SetSeq
(
m_sent
);
158
Ptr<Packet>
p = Create<Packet> (
m_size
-(8+4));
// 8+4 : the size of the seqTs header
159
p->
AddHeader
(seqTs);
160
161
std::stringstream peerAddressStringStream;
162
if
(
Ipv4Address::IsMatchingType
(
m_peerAddress
))
163
{
164
peerAddressStringStream <<
Ipv4Address::ConvertFrom
(
m_peerAddress
);
165
}
166
else
if
(
Ipv6Address::IsMatchingType
(
m_peerAddress
))
167
{
168
peerAddressStringStream <<
Ipv6Address::ConvertFrom
(
m_peerAddress
);
169
}
170
171
if
((
m_socket
->
Send
(p)) >= 0)
172
{
173
++
m_sent
;
174
NS_LOG_INFO
(
"TraceDelay TX "
<<
m_size
<<
" bytes to "
175
<< peerAddressStringStream.str () <<
" Uid: "
176
<< p->
GetUid
() <<
" Time: "
177
<< (
Simulator::Now
()).GetSeconds ());
178
179
}
180
else
181
{
182
NS_LOG_INFO
(
"Error while sending "
<<
m_size
<<
" bytes to "
183
<< peerAddressStringStream.str ());
184
}
185
186
if
(
m_sent
<
m_count
)
187
{
188
m_sendEvent
=
Simulator::Schedule
(
m_interval
, &
UdpClient::Send
,
this
);
189
}
190
}
191
192
}
// Namespace ns3
src
applications
model
udp-client.cc
Generated on Tue May 14 2013 11:08:16 for ns-3 by
1.8.1.2