A Discrete-Event Network Simulator
API
three-gpp-http-example.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2016 Magister Solutions
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: Lauri Sormunen <lauri.sormunen@magister.fi>
19 */
20
21#include "ns3/core-module.h"
22#include "ns3/network-module.h"
23#include "ns3/internet-module.h"
24#include "ns3/point-to-point-module.h"
25#include "ns3/applications-module.h"
26
27using namespace ns3;
28
29NS_LOG_COMPONENT_DEFINE ("ThreeGppHttpExample");
30
31void
33{
34 NS_LOG_INFO ("Client has established a connection to the server.");
35}
36
37void
39{
40 NS_LOG_INFO ("Server generated a main object of " << size << " bytes.");
41}
42
43void
45{
46 NS_LOG_INFO ("Server generated an embedded object of " << size << " bytes.");
47}
48
49void
51{
52 NS_LOG_INFO ("Server sent a packet of " << packet->GetSize () << " bytes.");
53}
54
55void
57{
58 NS_LOG_INFO ("Client received a packet of " << packet->GetSize () << " bytes from " << address);
59}
60
61void
63{
64 Ptr<Packet> p = packet->Copy ();
65 ThreeGppHttpHeader header;
66 p->RemoveHeader (header);
67 if (header.GetContentLength () == p->GetSize ()
68 && header.GetContentType () == ThreeGppHttpHeader::MAIN_OBJECT)
69 {
70 NS_LOG_INFO ("Client has successfully received a main object of "
71 << p->GetSize () << " bytes.");
72 }
73 else
74 {
75 NS_LOG_INFO ("Client failed to parse a main object. ");
76 }
77}
78
79void
81{
82 Ptr<Packet> p = packet->Copy ();
83 ThreeGppHttpHeader header;
84 p->RemoveHeader (header);
85 if (header.GetContentLength () == p->GetSize ()
86 && header.GetContentType () == ThreeGppHttpHeader::EMBEDDED_OBJECT)
87 {
88 NS_LOG_INFO ("Client has successfully received an embedded object of "
89 << p->GetSize () << " bytes.");
90 }
91 else
92 {
93 NS_LOG_INFO ("Client failed to parse an embedded object. ");
94 }
95}
96
97int
98main (int argc, char *argv[])
99{
100 double simTimeSec = 300;
101 CommandLine cmd (__FILE__);
102 cmd.AddValue ("SimulationTime", "Length of simulation in seconds.", simTimeSec);
103 cmd.Parse (argc, argv);
104
105 Time::SetResolution (Time::NS);
107 //LogComponentEnableAll (LOG_PREFIX_FUNC);
108 //LogComponentEnable ("ThreeGppHttpClient", LOG_INFO);
110 LogComponentEnable ("ThreeGppHttpExample", LOG_INFO);
111
112 // Setup two nodes
114 nodes.Create (2);
115
117 pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
118 pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
119
121 devices = pointToPoint.Install (nodes);
122
124 stack.Install (nodes);
125
127 address.SetBase ("10.1.1.0", "255.255.255.0");
128
130
131 Ipv4Address serverAddress = interfaces.GetAddress (1);
132
133 // Create HTTP server helper
134 ThreeGppHttpServerHelper serverHelper (serverAddress);
135
136 // Install HTTP server
137 ApplicationContainer serverApps = serverHelper.Install (nodes.Get (1));
138 Ptr<ThreeGppHttpServer> httpServer = serverApps.Get (0)->GetObject<ThreeGppHttpServer> ();
139
140 // Example of connecting to the trace sources
141 httpServer->TraceConnectWithoutContext ("ConnectionEstablished",
143 httpServer->TraceConnectWithoutContext ("MainObject", MakeCallback (&MainObjectGenerated));
144 httpServer->TraceConnectWithoutContext ("EmbeddedObject", MakeCallback (&EmbeddedObjectGenerated));
145 httpServer->TraceConnectWithoutContext ("Tx", MakeCallback (&ServerTx));
146
147 // Setup HTTP variables for the server
148 PointerValue varPtr;
149 httpServer->GetAttribute ("Variables", varPtr);
150 Ptr<ThreeGppHttpVariables> httpVariables = varPtr.Get<ThreeGppHttpVariables> ();
151 httpVariables->SetMainObjectSizeMean (102400); // 100kB
152 httpVariables->SetMainObjectSizeStdDev (40960); // 40kB
153
154
155 // Create HTTP client helper
156 ThreeGppHttpClientHelper clientHelper (serverAddress);
157
158 // Install HTTP client
159 ApplicationContainer clientApps = clientHelper.Install (nodes.Get (0));
160 Ptr<ThreeGppHttpClient> httpClient = clientApps.Get (0)->GetObject<ThreeGppHttpClient> ();
161
162 // Example of connecting to the trace sources
163 httpClient->TraceConnectWithoutContext ("RxMainObject", MakeCallback (&ClientMainObjectReceived));
164 httpClient->TraceConnectWithoutContext ("RxEmbeddedObject", MakeCallback (&ClientEmbeddedObjectReceived));
165 httpClient->TraceConnectWithoutContext ("Rx", MakeCallback (&ClientRx));
166
167 // Stop browsing after 30 minutes
168 clientApps.Stop (Seconds (simTimeSec));
169
170 Simulator::Run ();
171 Simulator::Destroy ();
172 return 0;
173}
a polymophic address class
Definition: address.h:91
holds a vector of ns3::Application pointers.
Parse command-line arguments.
Definition: command-line.h:229
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
holds a vector of std::pair of Ptr<Ipv4> and interface index.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
Build a set of PointToPointNetDevice objects.
Hold objects of type Ptr<T>.
Definition: pointer.h:37
Ptr< T > Get(void) const
Definition: pointer.h:201
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
Hold variables of type string.
Definition: string.h:41
Helper to make it easier to instantiate an ThreeGppHttpClient on a set of nodes.
Model application which simulates the traffic of a web browser.
Header used by web browsing applications to transmit information about content type,...
ContentType_t GetContentType() const
Helper to make it easier to instantiate an ThreeGppHttpServer on a set of nodes.
Model application which simulates the traffic of a web server.
Container of various random variables to assist in generating web browsing traffic pattern.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
address
Definition: first.py:44
serverApps
Definition: first.py:52
pointToPoint
Definition: first.py:35
clientApps
Definition: first.py:61
devices
Definition: first.py:39
stack
Definition: first.py:41
nodes
Definition: first.py:32
interfaces
Definition: first.py:48
Every class exported by the ns3 library is enclosed in the ns3 namespace.
@ LOG_PREFIX_TIME
Prefix all trace prints with simulation time.
Definition: log.h:119
@ LOG_INFO
Informational messages (e.g., banners).
Definition: log.h:106
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:361
void LogComponentEnableAll(enum LogLevel level)
Enable the logging output for all registered log components.
Definition: log.cc:385
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
cmd
Definition: second.py:35
void MainObjectGenerated(uint32_t size)
void ServerTx(Ptr< const Packet > packet)
void ClientRx(Ptr< const Packet > packet, const Address &address)
void ServerConnectionEstablished(Ptr< const ThreeGppHttpServer >, Ptr< Socket >)
void ClientEmbeddedObjectReceived(Ptr< const ThreeGppHttpClient >, Ptr< const Packet > packet)
void ClientMainObjectReceived(Ptr< const ThreeGppHttpClient >, Ptr< const Packet > packet)
void EmbeddedObjectGenerated(uint32_t size)