A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
three-gpp-http-client.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013 Magister Solutions
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Budiarto Herman <budiarto.herman@magister.fi>
7 *
8 */
9
11
13
14#include <ns3/address-utils.h>
15#include <ns3/callback.h>
16#include <ns3/double.h>
17#include <ns3/log.h>
18#include <ns3/packet.h>
19#include <ns3/pointer.h>
20#include <ns3/simulator.h>
21#include <ns3/socket.h>
22#include <ns3/tcp-socket-factory.h>
23#include <ns3/uinteger.h>
24
25NS_LOG_COMPONENT_DEFINE("ThreeGppHttpClient");
26
27namespace ns3
28{
29
30NS_OBJECT_ENSURE_REGISTERED(ThreeGppHttpClient);
31
33 : m_state{NOT_STARTED},
34 m_socket{nullptr},
35 m_objectBytesToBeReceived{0},
36 m_objectClientTs{},
37 m_objectServerTs{},
38 m_embeddedObjectsToBeRequested{0},
39 m_pageLoadStartTs{},
40 m_numberEmbeddedObjectsRequested{0},
41 m_numberBytesPage{0},
42 m_httpVariables{CreateObject<ThreeGppHttpVariables>()},
43 m_peerPort{}
44{
45 NS_LOG_FUNCTION(this);
46}
47
48// static
51{
52 static TypeId tid =
53 TypeId("ns3::ThreeGppHttpClient")
55 .AddConstructor<ThreeGppHttpClient>()
56 .AddAttribute(
57 "Variables",
58 "Variable collection, which is used to control e.g. timing and HTTP request size.",
62 .AddAttribute("RemoteServerAddress",
63 "The address of the destination server.",
68 "Replaced by Remote in ns-3.44.")
69 .AddAttribute("RemoteServerPort",
70 "The destination port of the outbound packets.",
71 UintegerValue(80), // the default HTTP port
75 "Replaced by Remote in ns-3.44.")
76 .AddTraceSource("RxPage",
77 "A page has been received.",
79 "ns3::ThreeGppHttpClient::RxPageTracedCallback")
80 .AddTraceSource(
81 "ConnectionEstablished",
82 "Connection to the destination web server has been established.",
84 "ns3::ThreeGppHttpClient::TracedCallback")
85 .AddTraceSource("ConnectionClosed",
86 "Connection to the destination web server is closed.",
88 "ns3::ThreeGppHttpClient::TracedCallback")
89 .AddTraceSource("Tx",
90 "General trace for sending a packet of any kind.",
92 "ns3::Packet::TracedCallback")
93 .AddTraceSource(
94 "TxMainObjectRequest",
95 "Sent a request for a main object.",
97 "ns3::Packet::TracedCallback")
98 .AddTraceSource(
99 "TxEmbeddedObjectRequest",
100 "Sent a request for an embedded object.",
102 "ns3::Packet::TracedCallback")
103 .AddTraceSource("RxMainObjectPacket",
104 "A packet of main object has been received.",
106 "ns3::Packet::TracedCallback")
107 .AddTraceSource("RxMainObject",
108 "Received a whole main object. Header is included.",
110 "ns3::ThreeGppHttpClient::TracedCallback")
111 .AddTraceSource(
112 "RxEmbeddedObjectPacket",
113 "A packet of embedded object has been received.",
115 "ns3::Packet::TracedCallback")
116 .AddTraceSource("RxEmbeddedObject",
117 "Received a whole embedded object. Header is included.",
119 "ns3::ThreeGppHttpClient::TracedCallback")
120 .AddTraceSource("Rx",
121 "General trace for receiving a packet of any kind.",
123 "ns3::Packet::PacketAddressTracedCallback")
124 .AddTraceSource("RxDelay",
125 "General trace of delay for receiving a complete object.",
127 "ns3::Application::DelayAddressCallback")
128 .AddTraceSource(
129 "RxRtt",
130 "General trace of round trip delay time for receiving a complete object.",
132 "ns3::Application::DelayAddressCallback")
133 .AddTraceSource("StateTransition",
134 "Trace fired upon every HTTP client state transition.",
136 "ns3::Application::StateTransitionCallback");
137 return tid;
138}
139
140void
142{
143 NS_LOG_FUNCTION(this << addr);
144 if (!addr.IsInvalid())
145 {
146 m_peer = addr;
147 if (m_peerPort)
148 {
150 }
151 }
152}
153
154void
156{
157 NS_LOG_FUNCTION(this << port);
158 if (m_peer.IsInvalid())
159 {
160 // save for later
162 return;
163 }
165 {
167 }
168}
169
172{
173 return m_socket;
174}
175
178{
179 return m_state;
180}
181
182std::string
187
188// static
189std::string
191{
192 switch (state)
193 {
194 case NOT_STARTED:
195 return "NOT_STARTED";
196 case CONNECTING:
197 return "CONNECTING";
199 return "EXPECTING_MAIN_OBJECT";
201 return "PARSING_MAIN_OBJECT";
203 return "EXPECTING_EMBEDDED_OBJECT";
204 case READING:
205 return "READING";
206 case STOPPED:
207 return "STOPPED";
208 default:
209 NS_FATAL_ERROR("Unknown state");
210 return "FATAL_ERROR";
211 }
212}
213
214void
216{
217 NS_LOG_FUNCTION(this);
218
220 {
222 }
223
224 Application::DoDispose(); // Chain up.
225}
226
227void
229{
230 NS_LOG_FUNCTION(this);
231
232 if (m_state == NOT_STARTED)
233 {
234 m_httpVariables->Initialize();
236 }
237 else
238 {
239 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for StartApplication().");
240 }
241}
242
243void
255
256void
258{
259 NS_LOG_FUNCTION(this << socket);
260
261 if (m_state != CONNECTING)
262 {
263 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ConnectionSucceeded().");
264 }
265
266 NS_ASSERT_MSG(m_socket == socket, "Invalid socket.");
268 socket->SetRecvCallback(MakeCallback(&ThreeGppHttpClient::ReceivedDataCallback, this));
271}
272
273void
275{
276 NS_LOG_FUNCTION(this << socket);
277
278 if (m_state == CONNECTING)
279 {
280 NS_LOG_ERROR("Client failed to connect to remote address " << m_peer);
281 }
282 else
283 {
284 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ConnectionFailed().");
285 }
286}
287
288void
290{
291 NS_LOG_FUNCTION(this << socket);
292
294
295 if (socket->GetErrno() != Socket::ERROR_NOTERROR)
296 {
297 NS_LOG_ERROR(this << " Connection has been terminated,"
298 << " error code: " << socket->GetErrno() << ".");
299 }
300
303
305}
306
307void
309{
310 NS_LOG_FUNCTION(this << socket);
311
313 if (socket->GetErrno() != Socket::ERROR_NOTERROR)
314 {
315 NS_LOG_ERROR(this << " Connection has been terminated,"
316 << " error code: " << socket->GetErrno() << ".");
317 }
318
320}
321
322void
324{
325 NS_LOG_FUNCTION(this << socket);
326
327 Address from;
328 while (auto packet = socket->RecvFrom(from))
329 {
330 if (packet->GetSize() == 0)
331 {
332 break; // EOF
333 }
334
335#ifdef NS3_LOG_ENABLE
336 // Some log messages.
338 {
339 NS_LOG_INFO(this << " A packet of " << packet->GetSize() << " bytes"
340 << " received from " << InetSocketAddress::ConvertFrom(from).GetIpv4()
341 << " port " << InetSocketAddress::ConvertFrom(from).GetPort() << " / "
342 << InetSocketAddress::ConvertFrom(from) << ".");
343 }
345 {
346 NS_LOG_INFO(this << " A packet of " << packet->GetSize() << " bytes"
347 << " received from " << Inet6SocketAddress::ConvertFrom(from).GetIpv6()
348 << " port " << Inet6SocketAddress::ConvertFrom(from).GetPort() << " / "
349 << Inet6SocketAddress::ConvertFrom(from) << ".");
350 }
351#endif /* NS3_LOG_ENABLE */
352
353 m_rxTrace(packet, from);
354
355 switch (m_state)
356 {
358 ReceiveMainObject(packet, from);
359 break;
361 ReceiveEmbeddedObject(packet, from);
362 break;
363 default:
364 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ReceivedData().");
365 break;
366 }
367
368 } // end of `while ((packet = socket->RecvFrom (from)))`
369
370} // end of `void ReceivedDataCallback (Ptr<Socket> socket)`
371
372void
374{
375 NS_LOG_FUNCTION(this);
376
379 {
380 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for OpenConnection().");
381 }
382
384 NS_ABORT_MSG_IF(m_peer.IsInvalid(), "Remote address not properly set");
385 if (!m_local.IsInvalid())
386 {
391 "Incompatible peer and local address IP version");
392 }
394 {
395 const auto ret [[maybe_unused]] =
397 NS_LOG_DEBUG(this << " Bind() return value= " << ret
398 << " GetErrNo= " << m_socket->GetErrno() << ".");
399
400 const auto ipv4 = InetSocketAddress::ConvertFrom(m_peer).GetIpv4();
402 NS_LOG_INFO(this << " Connecting to " << ipv4 << " port " << port << " / " << m_peer
403 << ".");
405 }
407 {
408 const auto ret [[maybe_unused]] =
410 NS_LOG_DEBUG(this << " Bind6() return value= " << ret
411 << " GetErrNo= " << m_socket->GetErrno() << ".");
412
415 NS_LOG_INFO(this << " Connecting to " << ipv6 << " port " << port << " / " << m_peer
416 << ".");
417 }
418 else
419 {
420 NS_ASSERT_MSG(false, "Incompatible address type: " << m_peer);
421 }
422
423 const auto ret [[maybe_unused]] = m_socket->Connect(m_peer);
424 NS_LOG_DEBUG(this << " Connect() return value= " << ret << " GetErrNo= " << m_socket->GetErrno()
425 << ".");
426
427 NS_ASSERT_MSG(m_socket, "Failed creating socket.");
428
430
437 m_socket->SetAttribute("MaxSegLifetime", DoubleValue(0.02)); // 20 ms.
438} // end of `void OpenConnection ()`
439
440void
442{
443 NS_LOG_FUNCTION(this);
444
445 if (m_state != CONNECTING && m_state != READING)
446 {
447 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for RequestMainObject().");
448 }
449
450 ThreeGppHttpHeader header;
451 header.SetContentLength(0); // Request does not need any content length.
453 header.SetClientTs(Simulator::Now());
454
455 const auto requestSize = m_httpVariables->GetRequestSize();
456 auto packet = Create<Packet>(requestSize);
457 packet->AddHeader(header);
458 const auto packetSize = packet->GetSize();
460 m_txTrace(packet);
461 const auto actualBytes = m_socket->Send(packet);
462 NS_LOG_DEBUG(this << " Send() packet " << packet << " of " << packet->GetSize() << " bytes,"
463 << " return value= " << actualBytes << ".");
464 if (actualBytes != static_cast<int>(packetSize))
465 {
466 NS_LOG_ERROR(this << " Failed to send request for embedded object,"
467 << " GetErrNo= " << m_socket->GetErrno() << ","
468 << " waiting for another Tx opportunity.");
469 }
470 else
471 {
473 m_pageLoadStartTs = Simulator::Now(); // start counting page loading time
474 }
475
476} // end of `void RequestMainObject ()`
477
478void
480{
481 NS_LOG_FUNCTION(this);
482
485 {
486 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for RequestEmbeddedObject().");
487 }
488
490 {
491 NS_LOG_WARN(this << " No embedded object to be requested.");
492 return;
493 }
494
495 ThreeGppHttpHeader header;
496 header.SetContentLength(0); // Request does not need any content length.
498 header.SetClientTs(Simulator::Now());
499
500 const auto requestSize = m_httpVariables->GetRequestSize();
501 auto packet = Create<Packet>(requestSize);
502 packet->AddHeader(header);
503 const auto packetSize = packet->GetSize();
505 m_txTrace(packet);
506 const auto actualBytes = m_socket->Send(packet);
507 NS_LOG_DEBUG(this << " Send() packet " << packet << " of " << packet->GetSize() << " bytes,"
508 << " return value= " << actualBytes << ".");
509
510 if (actualBytes != static_cast<int>(packetSize))
511 {
512 NS_LOG_ERROR(this << " Failed to send request for embedded object,"
513 << " GetErrNo= " << m_socket->GetErrno() << ","
514 << " waiting for another Tx opportunity.");
515 }
516 else
517 {
520 }
521
522} // end of `void RequestEmbeddedObject ()`
523
524void
526{
527 NS_LOG_FUNCTION(this << packet << from);
528
530 {
531 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ReceiveMainObject().");
532 }
533
534 /*
535 * In the following call to Receive(), #m_objectBytesToBeReceived *will*
536 * be updated. #m_objectClientTs and #m_objectServerTs *may* be updated.
537 * ThreeGppHttpHeader will be removed from the packet, if it is the first
538 * packet of the object to be received; the header will be available in
539 * #m_constructedPacketHeader.
540 * #m_constructedPacket will also be updated.
541 */
542 Receive(packet);
544
546 {
547 /*
548 * There are more packets of this main object, so just stay still
549 * and wait until they arrive.
550 */
551 NS_LOG_INFO(this << " " << m_objectBytesToBeReceived << " byte(s)"
552 << " remains from this chunk of main object.");
553 return;
554 }
555
556 /*
557 * This is the last packet of this main object. Acknowledge the
558 * reception of a whole main object
559 */
560 NS_LOG_INFO(this << " Finished receiving a main object.");
562
564 {
566 m_objectServerTs = MilliSeconds(0); // Reset back to zero.
567 }
568
570 {
572 m_objectClientTs = MilliSeconds(0); // Reset back to zero.
573 }
574
576} // end of `void ReceiveMainObject (Ptr<Packet> packet)`
577
578void
580{
581 NS_LOG_FUNCTION(this << packet << from);
582
584 {
585 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ReceiveEmbeddedObject().");
586 }
587
588 /*
589 * In the following call to Receive(), #m_objectBytesToBeReceived *will*
590 * be updated. #m_objectClientTs and #m_objectServerTs *may* be updated.
591 * ThreeGppHttpHeader will be removed from the packet, if it is the first
592 * packet of the object to be received; the header will be available in
593 * #m_constructedPacket, which will also be updated.
594 */
595 Receive(packet);
597
599 {
600 /*
601 * There are more packets of this embedded object, so just stay
602 * still and wait until they arrive.
603 */
604 NS_LOG_INFO(this << " " << m_objectBytesToBeReceived << " byte(s)"
605 << " remains from this chunk of embedded object");
606 return;
607 }
608
609 /*
610 * This is the last packet of this embedded object. Acknowledge
611 * the reception of a whole embedded object
612 */
613 NS_LOG_INFO(this << " Finished receiving an embedded object.");
615
617 {
619 m_objectServerTs = MilliSeconds(0); // Reset back to zero.
620 }
621
623 {
625 m_objectClientTs = MilliSeconds(0); // Reset back to zero.
626 }
627
629 {
631 << " more embedded object(s) to be requested.");
632 // Immediately request another using the existing connection.
635 }
636 else
637 {
638 /*
639 * There is no more embedded object, the web page has been
640 * downloaded completely. Now is the time to read it.
641 */
642 NS_LOG_INFO(this << " Finished receiving a web page.");
643 FinishReceivingPage(); // trigger callback for page loading time
645 }
646} // end of `void ReceiveEmbeddedObject (Ptr<Packet> packet)`
647
648void
650{
651 NS_LOG_FUNCTION(this << packet);
652
653 /* In a "real" HTTP message the message size is coded differently. The use of a header
654 * is to avoid the burden of doing a real message parser.
655 */
656 bool firstPacket = false;
657
659 {
660 // This is the first packet of the object.
661 firstPacket = true;
662
663 // Remove the header in order to calculate remaining data to be received.
664 ThreeGppHttpHeader httpHeader;
665 packet->RemoveHeader(httpHeader);
666
668 m_objectClientTs = httpHeader.GetClientTs();
669 m_objectServerTs = httpHeader.GetServerTs();
670
671 // Take a copy for constructed packet trace. Note that header is included.
672 m_constructedPacket = packet->Copy();
673 m_constructedPacket->AddHeader(httpHeader);
674 }
675 auto contentSize = packet->GetSize();
676 m_numberBytesPage += contentSize; // increment counter of page size
677
678 /* Note that the packet does not contain header at this point.
679 * The content is purely raw data, which was the only intended data to be received.
680 */
681 if (m_objectBytesToBeReceived < contentSize)
682 {
683 NS_LOG_WARN(this << " The received packet"
684 << " (" << contentSize << " bytes of content)"
685 << " is larger than"
686 << " the content that we expected to receive"
687 << " (" << m_objectBytesToBeReceived << " bytes).");
688 // Stop expecting any more packet of this object.
690 m_constructedPacket = nullptr;
691 }
692 else
693 {
694 m_objectBytesToBeReceived -= contentSize;
695 if (!firstPacket)
696 {
697 auto packetCopy = packet->Copy();
698 m_constructedPacket->AddAtEnd(packetCopy);
699 }
700 }
701
702} // end of `void Receive (packet)`
703
704void
706{
707 NS_LOG_FUNCTION(this);
708
710 {
711 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for EnterParsingTime().");
712 }
713
714 const auto parsingTime = m_httpVariables->GetParsingTime();
715 NS_LOG_INFO(this << " The parsing of this main object will complete in "
716 << parsingTime.As(Time::S) << ".");
720}
721
722void
724{
725 NS_LOG_FUNCTION(this);
726
728 {
729 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for ParseMainObject().");
730 }
731
732 m_embeddedObjectsToBeRequested = m_httpVariables->GetNumOfEmbeddedObjects();
733 // saving total number of embedded objects
735 NS_LOG_INFO(this << " Parsing has determined " << m_embeddedObjectsToBeRequested
736 << " embedded object(s) in the main object.");
737
739 {
740 /*
741 * Immediately request the first embedded object using the
742 * existing connection.
743 */
746 }
747 else
748 {
749 /*
750 * There is no embedded object in the main object. So sit back and
751 * enjoy the plain web page.
752 */
753 NS_LOG_INFO(this << " Finished receiving a web page.");
754 FinishReceivingPage(); // trigger callback for page loading time
756 }
757
758} // end of `void ParseMainObject ()`
759
760void
762{
763 NS_LOG_FUNCTION(this);
764
766 {
767 NS_FATAL_ERROR("Invalid state " << GetStateString() << " for EnterReadingTime().");
768 }
769
770 const auto readingTime = m_httpVariables->GetReadingTime();
771 NS_LOG_INFO(this << " Client will finish reading this web page in " << readingTime.As(Time::S)
772 << ".");
773
774 // Schedule a request of another main object once the reading time expires.
778}
779
780void
782{
783 NS_LOG_FUNCTION(this);
784
786 {
787 NS_LOG_INFO(this << " Canceling RequestMainObject() which is due in "
790 }
791
793 {
794 NS_LOG_INFO(this << " Canceling RequestEmbeddedObject() which is due in "
796 << ".");
798 }
799
801 {
802 NS_LOG_INFO(this << " Canceling ParseMainObject() which is due in "
805 }
806}
807
808void
810{
811 const auto oldState = GetStateString();
812 const auto newState = GetStateString(state);
813 NS_LOG_FUNCTION(this << oldState << newState);
814
815 if ((state == EXPECTING_MAIN_OBJECT) || (state == EXPECTING_EMBEDDED_OBJECT))
816 {
818 {
819 NS_FATAL_ERROR("Cannot start a new receiving session"
820 << " if the previous object"
821 << " (" << m_objectBytesToBeReceived << " bytes)"
822 << " is not completely received yet.");
823 }
824 }
825
826 m_state = state;
827 NS_LOG_INFO(this << " HttpClient " << oldState << " --> " << newState << ".");
828 m_stateTransitionTrace(oldState, newState);
829}
830
831void
842
843} // namespace ns3
a polymophic address class
Definition address.h:90
bool IsInvalid() const
Definition address.cc:60
AttributeValue implementation for Address.
Definition address.h:275
void DoDispose() override
Destructor implementation.
Ptr< Node > GetNode() const
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
uint16_t GetPort() const
Get the port.
static bool IsMatchingType(const Address &addr)
If the address match.
Ipv6Address GetIpv6() const
Get the IPv6 address.
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 bool IsMatchingType(const Address &address)
static bool IsMatchingType(const Address &address)
If the Address matches the type.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
void AddAtEnd(Ptr< const Packet > packet)
Concatenate the input packet at the end of the current packet.
Definition packet.cc:343
void AddHeader(const Header &header)
Add header to this packet.
Definition packet.cc:257
AttributeValue implementation for Pointer.
Smart pointer class similar to boost::intrusive_ptr.
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 bool IsFinished()
Check if the simulation should finish.
Definition simulator.cc:160
static Time Now()
Return the current simulation virtual time.
Definition simulator.cc:197
static bool IsExpired(const EventId &id)
Check if an event has already run or been cancelled.
Definition simulator.cc:284
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
Definition simulator.h:594
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
Definition simulator.cc:206
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
void SetConnectCallback(Callback< void, Ptr< Socket > > connectionSucceeded, Callback< void, Ptr< Socket > > connectionFailed)
Specify callbacks to allow the caller to determine if the connection succeeds of fails.
Definition socket.cc:76
virtual Socket::SocketErrno GetErrno() const =0
Get last error number.
void SetIpTos(uint8_t ipTos)
Manually set IP Type of Service field.
Definition socket.cc:423
virtual int Bind6()=0
Allocate a local IPv6 endpoint for this socket.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
void SetCloseCallbacks(Callback< void, Ptr< Socket > > normalClose, Callback< void, Ptr< Socket > > errorClose)
Detect socket recv() events such as graceful shutdown or error.
Definition socket.cc:85
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 Close()=0
Close a socket.
@ ERROR_NOTERROR
Definition socket.h:74
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Base class for source applications.
Address m_local
Local address to bind to.
uint8_t m_tos
The packets Type of Service.
Address m_peer
Peer address.
static TypeId GetTypeId()
Get the type ID.
ns3::TracedCallback< const Time &, const Address & > m_rxRttTrace
The RxRtt trace source.
Time m_pageLoadStartTs
The time stamp when the page started loading.
ns3::TracedCallback< Ptr< const ThreeGppHttpClient >, const Time &, uint32_t, uint32_t > m_rxPageTrace
The RxPage trace source.
void SetPort(uint16_t port)
set the remote port (temporary function until deprecated attributes are removed)
void ReceiveMainObject(Ptr< Packet > packet, const Address &from)
Receive a packet of main object from the destination web server.
ns3::TracedCallback< Ptr< const ThreeGppHttpClient > > m_connectionClosedTrace
The ConnectionClosed trace source.
std::optional< uint16_t > m_peerPort
The RemoteServerPort attribute.
ns3::TracedCallback< const Time &, const Address & > m_rxDelayTrace
The RxDelay trace source.
ns3::TracedCallback< Ptr< const ThreeGppHttpClient >, Ptr< const Packet > > m_rxEmbeddedObjectTrace
The TxEmbeddedObject trace source.
Ptr< ThreeGppHttpVariables > m_httpVariables
The Variables attribute.
uint32_t m_embeddedObjectsToBeRequested
Determined after parsing the main object.
EventId m_eventParseMainObject
An event of ParseMainObject(), scheduled to trigger after parsing time has elapsed.
void SwitchToState(State_t state)
Change the state of the client.
uint32_t m_numberEmbeddedObjectsRequested
Number of embedded objects to requested in the current page.
void ConnectionFailedCallback(Ptr< Socket > socket)
Invoked when m_socket cannot establish a connection with the web server.
ThreeGppHttpClient()
Creates a new instance of HTTP client application.
ns3::TracedCallback< Ptr< const Packet >, const Address & > m_rxTrace
The Rx trace source.
void EnterParsingTime()
Becomes idle for a randomly determined amount of time, and then triggers ParseMainObject().
State_t m_state
The current state of the client application. Begins with NOT_STARTED.
void FinishReceivingPage()
Finish receiving a page.
Ptr< Socket > m_socket
The socket for sending and receiving packets to/from the web server.
void RequestEmbeddedObject()
Send a request object for an embedded object to the destination web server.
void ParseMainObject()
Randomly determines the number of embedded objects in the main object.
ns3::TracedCallback< Ptr< const ThreeGppHttpClient >, Ptr< const Packet > > m_rxMainObjectTrace
The TxMainObject trace source.
State_t GetState() const
Returns the current state of the application.
void EnterReadingTime()
Becomes idle for a randomly determined amount of time, and then triggers RequestMainObject().
void DoDispose() override
Destructor implementation.
void StartApplication() override
Application specific startup code.
Ptr< Packet > m_constructedPacket
The packet constructed of one or more parts with ThreeGppHttpHeader.
uint32_t m_objectBytesToBeReceived
According to the content length specified by the ThreeGppHttpHeader.
void ConnectionSucceededCallback(Ptr< Socket > socket)
Invoked when a connection is established successfully on m_socket.
static TypeId GetTypeId()
Returns the object TypeId.
void ErrorCloseCallback(Ptr< Socket > socket)
Invoked when connection between m_socket and the web sever is terminated.
EventId m_eventRequestMainObject
An event of either RequestMainObject() or OpenConnection(), scheduled to trigger after a connection h...
uint32_t m_numberBytesPage
Number of bytes received for the current page.
void CancelAllPendingEvents()
Cancels m_eventRequestMainObject, m_eventRequestEmbeddedObject, and m_eventParseMainObject.
Ptr< Socket > GetSocket() const
Returns a pointer to the associated socket.
ns3::TracedCallback< Ptr< const Packet > > m_txTrace
The Tx trace source.
Time m_objectClientTs
The client time stamp of the ThreeGppHttpHeader from the last received packet.
State_t
The possible states of the application.
@ CONNECTING
Sent the server a connection request and waiting for the server to be accept it.
@ NOT_STARTED
Before StartApplication() is invoked.
@ READING
User reading a web page that has just been received.
@ EXPECTING_MAIN_OBJECT
Sent the server a request for a main object and waiting to receive the packets.
@ STOPPED
After StopApplication() is invoked.
@ PARSING_MAIN_OBJECT
Parsing a main object that has just been received.
@ EXPECTING_EMBEDDED_OBJECT
Sent the server a request for an embedded object and waiting to receive the packets.
ns3::TracedCallback< Ptr< const Packet > > m_txMainObjectRequestTrace
The TxMainObjectRequest trace source.
void StopApplication() override
Application specific shutdown code.
ns3::TracedCallback< Ptr< const Packet > > m_rxMainObjectPacketTrace
The TxMainObjectPacket trace source.
void SetRemote(const Address &addr) override
set the remote address
ns3::TracedCallback< const std::string &, const std::string & > m_stateTransitionTrace
The StateTransition trace source.
void RequestMainObject()
Send a request object for a main object to the destination web server.
Time m_objectServerTs
The server time stamp of the ThreeGppHttpHeader from the last received packet.
void NormalCloseCallback(Ptr< Socket > socket)
Invoked when connection between m_socket and the web sever is terminated.
ns3::TracedCallback< Ptr< const ThreeGppHttpClient > > m_connectionEstablishedTrace
The ConnectionEstablished trace source.
ns3::TracedCallback< Ptr< const Packet > > m_txEmbeddedObjectRequestTrace
The TxEmbeddedObjectRequest trace source.
void ReceivedDataCallback(Ptr< Socket > socket)
Invoked when m_socket receives some packet data.
ns3::TracedCallback< Ptr< const Packet > > m_rxEmbeddedObjectPacketTrace
The TxEmbeddedObjectPacket trace source.
void Receive(Ptr< Packet > packet)
Simulate a consumption of the received packet by subtracting the packet size from the internal counte...
void ReceiveEmbeddedObject(Ptr< Packet > packet, const Address &from)
Receive a packet of embedded object from the destination web server.
void OpenConnection()
Initialize m_socket to connect to the destination web server at m_peer and m_peerPort and set up call...
std::string GetStateString() const
Returns the current state of the application in string format.
EventId m_eventRequestEmbeddedObject
An event of either RequestEmbeddedObject() or OpenConnection().
Header used by web browsing applications to transmit information about content type,...
void SetContentLength(uint32_t contentLength)
void SetContentType(ContentType_t contentType)
@ EMBEDDED_OBJECT
Integer equivalent = 2.
@ MAIN_OBJECT
Integer equivalent = 1.
Container of various random variables to assist in generating web browsing traffic pattern.
@ S
second
Definition nstime.h:105
bool IsZero() const
Exactly equivalent to t == 0.
Definition nstime.h:304
a unique identifier for an interface.
Definition type-id.h:48
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition type-id.cc:1001
@ DEPRECATED
Attribute or trace source is deprecated; user is warned.
Definition type-id.h:64
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
Ptr< const AttributeChecker > MakeAddressChecker()
Definition address.cc:169
Ptr< const AttributeAccessor > MakeAddressAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Definition address.h:275
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Definition pointer.h:248
Ptr< AttributeChecker > MakePointerChecker()
Create a PointerChecker for a type.
Definition pointer.h:269
Ptr< const AttributeChecker > MakeUintegerChecker()
Definition uinteger.h:85
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Definition uinteger.h:35
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_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition abort.h:97
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition log.h:243
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition log.h:257
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition log.h:250
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition log.h:264
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
#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 MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1356
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Address ConvertToSocketAddress(const Address &address, uint16_t port)
Convert IPv4/IPv6 address with port to a socket address.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition callback.h:684
static const uint32_t packetSize
Packet size generated at the AP.