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
bulk-send-application.cc
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2010 Georgia Institute of Technology
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: George F. Riley <riley@ece.gatech.edu>
19
*/
20
21
#include "ns3/log.h"
22
#include "ns3/address.h"
23
#include "ns3/node.h"
24
#include "ns3/nstime.h"
25
#include "ns3/socket.h"
26
#include "ns3/simulator.h"
27
#include "ns3/socket-factory.h"
28
#include "ns3/packet.h"
29
#include "ns3/uinteger.h"
30
#include "ns3/trace-source-accessor.h"
31
#include "ns3/tcp-socket-factory.h"
32
#include "
bulk-send-application.h
"
33
34
NS_LOG_COMPONENT_DEFINE
(
"BulkSendApplication"
);
35
36
namespace
ns3 {
37
38
NS_OBJECT_ENSURE_REGISTERED
(BulkSendApplication);
39
40
TypeId
41
BulkSendApplication::GetTypeId
(
void
)
42
{
43
static
TypeId
tid =
TypeId
(
"ns3::BulkSendApplication"
)
44
.
SetParent
<
Application
> ()
45
.AddConstructor<BulkSendApplication> ()
46
.AddAttribute (
"SendSize"
,
"The amount of data to send each time."
,
47
UintegerValue
(512),
48
MakeUintegerAccessor (&
BulkSendApplication::m_sendSize
),
49
MakeUintegerChecker<uint32_t> (1))
50
.AddAttribute (
"Remote"
,
"The address of the destination"
,
51
AddressValue
(),
52
MakeAddressAccessor (&
BulkSendApplication::m_peer
),
53
MakeAddressChecker ())
54
.AddAttribute (
"MaxBytes"
,
55
"The total number of bytes to send. "
56
"Once these bytes are sent, "
57
"no data is sent again. The value zero means "
58
"that there is no limit."
,
59
UintegerValue
(0),
60
MakeUintegerAccessor (&
BulkSendApplication::m_maxBytes
),
61
MakeUintegerChecker<uint32_t> ())
62
.AddAttribute (
"Protocol"
,
"The type of protocol to use."
,
63
TypeIdValue
(
TcpSocketFactory::GetTypeId
()),
64
MakeTypeIdAccessor (&
BulkSendApplication::m_tid
),
65
MakeTypeIdChecker ())
66
.AddTraceSource (
"Tx"
,
"A new packet is created and is sent"
,
67
MakeTraceSourceAccessor
(&
BulkSendApplication::m_txTrace
))
68
;
69
return
tid;
70
}
71
72
73
BulkSendApplication::BulkSendApplication
()
74
: m_socket (0),
75
m_connected (false),
76
m_totBytes (0)
77
{
78
NS_LOG_FUNCTION
(
this
);
79
}
80
81
BulkSendApplication::~BulkSendApplication
()
82
{
83
NS_LOG_FUNCTION
(
this
);
84
}
85
86
void
87
BulkSendApplication::SetMaxBytes
(uint32_t maxBytes)
88
{
89
NS_LOG_FUNCTION
(
this
<< maxBytes);
90
m_maxBytes
= maxBytes;
91
}
92
93
Ptr<Socket>
94
BulkSendApplication::GetSocket
(
void
)
const
95
{
96
NS_LOG_FUNCTION
(
this
);
97
return
m_socket
;
98
}
99
100
void
101
BulkSendApplication::DoDispose
(
void
)
102
{
103
NS_LOG_FUNCTION
(
this
);
104
105
m_socket
= 0;
106
// chain up
107
Application::DoDispose
();
108
}
109
110
// Application Methods
111
void
BulkSendApplication::StartApplication
(
void
)
// Called at time specified by Start
112
{
113
NS_LOG_FUNCTION
(
this
);
114
115
// Create the socket if not already
116
if
(!
m_socket
)
117
{
118
m_socket
=
Socket::CreateSocket
(
GetNode
(),
m_tid
);
119
120
// Fatal error if socket type is not NS3_SOCK_STREAM or NS3_SOCK_SEQPACKET
121
if
(
m_socket
->
GetSocketType
() !=
Socket::NS3_SOCK_STREAM
&&
122
m_socket
->
GetSocketType
() !=
Socket::NS3_SOCK_SEQPACKET
)
123
{
124
NS_FATAL_ERROR
(
"Using BulkSend with an incompatible socket type. "
125
"BulkSend requires SOCK_STREAM or SOCK_SEQPACKET. "
126
"In other words, use TCP instead of UDP."
);
127
}
128
129
m_socket
->
Bind
();
130
m_socket
->
Connect
(
m_peer
);
131
m_socket
->
ShutdownRecv
();
132
m_socket
->
SetConnectCallback
(
133
MakeCallback
(&
BulkSendApplication::ConnectionSucceeded
,
this
),
134
MakeCallback
(&
BulkSendApplication::ConnectionFailed
,
this
));
135
m_socket
->
SetSendCallback
(
136
MakeCallback
(&
BulkSendApplication::DataSend
,
this
));
137
}
138
if
(
m_connected
)
139
{
140
SendData
();
141
}
142
}
143
144
void
BulkSendApplication::StopApplication
(
void
)
// Called at time specified by Stop
145
{
146
NS_LOG_FUNCTION
(
this
);
147
148
if
(
m_socket
!= 0)
149
{
150
m_socket
->
Close
();
151
m_connected
=
false
;
152
}
153
else
154
{
155
NS_LOG_WARN
(
"BulkSendApplication found null socket to close in StopApplication"
);
156
}
157
}
158
159
160
// Private helpers
161
162
void
BulkSendApplication::SendData
(
void
)
163
{
164
NS_LOG_FUNCTION
(
this
);
165
166
while
(
m_maxBytes
== 0 ||
m_totBytes
<
m_maxBytes
)
167
{
// Time to send more
168
uint32_t toSend =
m_sendSize
;
169
// Make sure we don't send too many
170
if
(
m_maxBytes
> 0)
171
{
172
toSend = std::min (
m_sendSize
,
m_maxBytes
-
m_totBytes
);
173
}
174
NS_LOG_LOGIC
(
"sending packet at "
<<
Simulator::Now
());
175
Ptr<Packet>
packet = Create<Packet> (toSend);
176
m_txTrace
(packet);
177
int
actual =
m_socket
->
Send
(packet);
178
if
(actual > 0)
179
{
180
m_totBytes
+= actual;
181
}
182
// We exit this loop when actual < toSend as the send side
183
// buffer is full. The "DataSent" callback will pop when
184
// some buffer space has freed ip.
185
if
((
unsigned
)actual != toSend)
186
{
187
break
;
188
}
189
}
190
// Check if time to close (all sent)
191
if
(
m_totBytes
==
m_maxBytes
&&
m_connected
)
192
{
193
m_socket
->
Close
();
194
m_connected
=
false
;
195
}
196
}
197
198
void
BulkSendApplication::ConnectionSucceeded
(
Ptr<Socket>
socket)
199
{
200
NS_LOG_FUNCTION
(
this
<< socket);
201
NS_LOG_LOGIC
(
"BulkSendApplication Connection succeeded"
);
202
m_connected
=
true
;
203
SendData
();
204
}
205
206
void
BulkSendApplication::ConnectionFailed
(
Ptr<Socket>
socket)
207
{
208
NS_LOG_FUNCTION
(
this
<< socket);
209
NS_LOG_LOGIC
(
"BulkSendApplication, Connection Failed"
);
210
}
211
212
void
BulkSendApplication::DataSend
(
Ptr<Socket>
, uint32_t)
213
{
214
NS_LOG_FUNCTION
(
this
);
215
216
if
(
m_connected
)
217
{
// Only send new data if the connection has completed
218
Simulator::ScheduleNow
(&
BulkSendApplication::SendData
,
this
);
219
}
220
}
221
222
223
224
}
// Namespace ns3
src
applications
model
bulk-send-application.cc
Generated on Tue Oct 9 2012 16:45:33 for ns-3 by
1.8.1.2