INET Framework for OMNeT++/OMNEST
inet::TcpBasicClientApp Class Reference

An example request-reply based client application. More...

#include <TcpBasicClientApp.h>

Inheritance diagram for inet::TcpBasicClientApp:
inet::TcpAppBase inet::ApplicationBase inet::TcpSocket::ICallback inet::OperationalBase inet::OperationalMixin< cSimpleModule > inet::ILifecycle

Public Member Functions

 TcpBasicClientApp ()
 
virtual ~TcpBasicClientApp ()
 
- Public Member Functions inherited from inet::ApplicationBase
 ApplicationBase ()
 
- Public Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual ~OperationalMixin ()
 }@ More...
 
- Public Member Functions inherited from inet::ILifecycle
virtual ~ILifecycle ()
 
- Public Member Functions inherited from inet::TcpSocket::ICallback
virtual ~ICallback ()
 

Protected Member Functions

virtual void sendRequest ()
 
virtual void rescheduleAfterOrDeleteTimer (simtime_t d, short int msgKind)
 
virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleTimer (cMessage *msg) override
 
virtual void socketEstablished (TcpSocket *socket) override
 
virtual void socketDataArrived (TcpSocket *socket, Packet *msg, bool urgent) override
 Notifies about data arrival, packet ownership is transferred to the callee. More...
 
virtual void socketClosed (TcpSocket *socket) override
 
virtual void socketFailure (TcpSocket *socket, int code) override
 
virtual void handleStartOperation (LifecycleOperation *operation) override
 
virtual void handleStopOperation (LifecycleOperation *operation) override
 
virtual void handleCrashOperation (LifecycleOperation *operation) override
 
virtual void close () override
 
- Protected Member Functions inherited from inet::TcpAppBase
virtual void handleMessageWhenUp (cMessage *msg) override
 
virtual void finish () override
 
virtual void refreshDisplay () const override
 
virtual void connect ()
 
virtual void sendPacket (Packet *pkt)
 
virtual void socketAvailable (TcpSocket *socket, TcpAvailableInfo *availableInfo) override
 
virtual void socketPeerClosed (TcpSocket *socket) override
 
virtual void socketStatusArrived (TcpSocket *socket, TcpStatusInfo *status) override
 
virtual void socketDeleted (TcpSocket *socket) override
 
- Protected Member Functions inherited from inet::ApplicationBase
virtual bool isInitializeStage (int stage) const override
 
virtual bool isModuleStartStage (int stage) const override
 
virtual bool isModuleStopStage (int stage) const override
 
- Protected Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual int numInitStages () const override
 
virtual void refreshDisplay () const override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void handleMessageWhenDown (cMessage *msg)
 
virtual bool handleOperationStage (LifecycleOperation *operation, IDoneCallback *doneCallback) override
 Perform one stage of a lifecycle operation. More...
 
virtual State getInitialOperationalState () const
 Returns initial operational state: OPERATING or NOT_OPERATING. More...
 
virtual void handleActiveOperationTimeout (cMessage *message)
 
virtual bool isUp () const
 utility functions More...
 
virtual bool isDown () const
 
virtual void setOperationalState (State newState)
 
virtual void scheduleOperationTimeout (simtime_t timeout)
 
virtual void setupActiveOperation (LifecycleOperation *operation, IDoneCallback *doneCallback, State)
 
virtual void delayActiveOperationFinish (simtime_t timeout)
 
virtual void startActiveOperationExtraTime (simtime_t delay=SIMTIME_ZERO)
 
virtual void startActiveOperationExtraTimeOrFinish (simtime_t extraTime)
 
virtual void finishActiveOperation ()
 

Protected Attributes

cMessage * timeoutMsg = nullptr
 
bool earlySend = false
 
int numRequestsToSend = 0
 
simtime_t startTime
 
simtime_t stopTime
 
- Protected Attributes inherited from inet::TcpAppBase
TcpSocket socket
 
int numSessions
 
int numBroken
 
int packetsSent
 
int packetsRcvd
 
int bytesSent
 
int bytesRcvd
 
- Protected Attributes inherited from inet::OperationalMixin< cSimpleModule >
State operationalState
 
simtime_t lastChange
 
Operation activeOperation
 
cMessage * activeOperationTimeout
 
cMessage * activeOperationExtraTimer
 

Additional Inherited Members

- Protected Types inherited from inet::OperationalMixin< cSimpleModule >
enum  State
 
- Static Protected Attributes inherited from inet::TcpAppBase
static simsignal_t connectSignal = registerSignal("connect")
 

Detailed Description

An example request-reply based client application.

Constructor & Destructor Documentation

◆ TcpBasicClientApp()

inet::TcpBasicClientApp::TcpBasicClientApp ( )
inline
48 {}

◆ ~TcpBasicClientApp()

inet::TcpBasicClientApp::~TcpBasicClientApp ( )
virtual
24 {
25  cancelAndDelete(timeoutMsg);
26 }

Member Function Documentation

◆ close()

void inet::TcpBasicClientApp::close ( )
overrideprotectedvirtual

Reimplemented from inet::TcpAppBase.

164 {
166  cancelEvent(timeoutMsg);
167 }

Referenced by handleStopOperation(), and socketDataArrived().

◆ handleCrashOperation()

void inet::TcpBasicClientApp::handleCrashOperation ( LifecycleOperation operation)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

63 {
64  cancelEvent(timeoutMsg);
65  if (operation->getRootModule() != getContainingNode(this))
66  socket.destroy();
67 }

◆ handleStartOperation()

void inet::TcpBasicClientApp::handleStartOperation ( LifecycleOperation operation)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

46 {
47  simtime_t now = simTime();
48  simtime_t start = std::max(startTime, now);
49  if (timeoutMsg && ((stopTime < SIMTIME_ZERO) || (start < stopTime) || (start == stopTime && startTime == stopTime))) {
50  timeoutMsg->setKind(MSGKIND_CONNECT);
51  scheduleAt(start, timeoutMsg);
52  }
53 }

◆ handleStopOperation()

void inet::TcpBasicClientApp::handleStopOperation ( LifecycleOperation operation)
overrideprotectedvirtual

◆ handleTimer()

void inet::TcpBasicClientApp::handleTimer ( cMessage *  msg)
overrideprotectedvirtual

Implements inet::TcpAppBase.

93 {
94  switch (msg->getKind()) {
95  case MSGKIND_CONNECT:
96  connect(); // active OPEN
97 
98  // significance of earlySend: if true, data will be sent already
99  // in the ACK of SYN, otherwise only in a separate packet (but still
100  // immediately)
101  if (earlySend)
102  sendRequest();
103  break;
104 
105  case MSGKIND_SEND:
106  sendRequest();
108  // no scheduleAt(): next request will be sent when reply to this one
109  // arrives (see socketDataArrived())
110  break;
111 
112  default:
113  throw cRuntimeError("Invalid timer msg: kind=%d", msg->getKind());
114  }
115 }

◆ initialize()

void inet::TcpBasicClientApp::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented from inet::TcpAppBase.

29 {
31  if (stage == INITSTAGE_LOCAL) {
33  earlySend = false; // TODO make it parameter
34  WATCH(numRequestsToSend);
35  WATCH(earlySend);
36 
37  startTime = par("startTime");
38  stopTime = par("stopTime");
39  if (stopTime >= SIMTIME_ZERO && stopTime < startTime)
40  throw cRuntimeError("Invalid startTime/stopTime parameters");
41  timeoutMsg = new cMessage("timer");
42  }
43 }

◆ numInitStages()

virtual int inet::TcpBasicClientApp::numInitStages ( ) const
inlineoverrideprotectedvirtual

Reimplemented from inet::TcpAppBase.

32 { return NUM_INIT_STAGES; }

◆ rescheduleAfterOrDeleteTimer()

void inet::TcpBasicClientApp::rescheduleAfterOrDeleteTimer ( simtime_t  d,
short int  msgKind 
)
protectedvirtual
134 {
135  if (stopTime < SIMTIME_ZERO || d < stopTime) {
136  timeoutMsg->setKind(msgKind);
137  rescheduleAfter(d, timeoutMsg);
138  }
139  else {
140  cancelAndDelete(timeoutMsg);
141  timeoutMsg = nullptr;
142  }
143 }

Referenced by socketClosed(), socketDataArrived(), and socketFailure().

◆ sendRequest()

void inet::TcpBasicClientApp::sendRequest ( )
protectedvirtual
70 {
71  long requestLength = par("requestLength");
72  long replyLength = par("replyLength");
73  if (requestLength < 1)
74  requestLength = 1;
75  if (replyLength < 1)
76  replyLength = 1;
77 
78  const auto& payload = makeShared<GenericAppMsg>();
79  Packet *packet = new Packet("data");
80  payload->setChunkLength(B(requestLength));
81  payload->setExpectedReplyLength(B(replyLength));
82  payload->setServerClose(false);
83  payload->addTag<CreationTimeTag>()->setCreationTime(simTime());
84  packet->insertAtBack(payload);
85 
86  EV_INFO << "sending request with " << requestLength << " bytes, expected reply length " << replyLength << " bytes,"
87  << "remaining " << numRequestsToSend - 1 << " request\n";
88 
89  sendPacket(packet);
90 }

Referenced by handleTimer(), and socketEstablished().

◆ socketClosed()

void inet::TcpBasicClientApp::socketClosed ( TcpSocket socket)
overrideprotectedvirtual

Reimplemented from inet::TcpAppBase.

170 {
172 
173  // start another session after a delay
174  if (timeoutMsg) {
175  simtime_t d = par("idleInterval");
177  }
178 }

◆ socketDataArrived()

void inet::TcpBasicClientApp::socketDataArrived ( TcpSocket socket,
Packet packet,
bool  urgent 
)
overrideprotectedvirtual

Notifies about data arrival, packet ownership is transferred to the callee.

Reimplemented from inet::TcpAppBase.

146 {
148 
149  if (numRequestsToSend > 0) {
150  EV_INFO << "reply arrived\n";
151 
152  if (timeoutMsg) {
153  simtime_t d = par("thinkTime");
155  }
156  }
157  else if (socket->getState() != TcpSocket::LOCALLY_CLOSED) {
158  EV_INFO << "reply to last request arrived, closing session\n";
159  close();
160  }
161 }

◆ socketEstablished()

void inet::TcpBasicClientApp::socketEstablished ( TcpSocket socket)
overrideprotectedvirtual

Reimplemented from inet::TcpAppBase.

118 {
120 
121  // determine number of requests in this session
122  numRequestsToSend = par("numRequestsPerSession");
123  if (numRequestsToSend < 1)
124  numRequestsToSend = 1;
125 
126  // perform first request if not already done (next one will be sent when reply arrives)
127  if (!earlySend)
128  sendRequest();
129 
131 }

◆ socketFailure()

void inet::TcpBasicClientApp::socketFailure ( TcpSocket socket,
int  code 
)
overrideprotectedvirtual

Reimplemented from inet::TcpAppBase.

181 {
183 
184  // reconnect after a delay
185  if (timeoutMsg) {
186  simtime_t d = par("reconnectInterval");
188  }
189 }

Member Data Documentation

◆ earlySend

bool inet::TcpBasicClientApp::earlySend = false
protected

◆ numRequestsToSend

int inet::TcpBasicClientApp::numRequestsToSend = 0
protected

◆ startTime

simtime_t inet::TcpBasicClientApp::startTime
protected

Referenced by handleStartOperation(), and initialize().

◆ stopTime

simtime_t inet::TcpBasicClientApp::stopTime
protected

◆ timeoutMsg


The documentation for this class was generated from the following files:
inet::TcpBasicClientApp::stopTime
simtime_t stopTime
Definition: TcpBasicClientApp.h:27
inet::TcpBasicClientApp::numRequestsToSend
int numRequestsToSend
Definition: TcpBasicClientApp.h:25
inet::TcpBasicClientApp::startTime
simtime_t startTime
Definition: TcpBasicClientApp.h:26
inet::TcpBasicClientApp::close
virtual void close() override
Definition: TcpBasicClientApp.cc:163
inet::getContainingNode
cModule * getContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:40
inet::TcpAppBase::initialize
virtual void initialize(int stage) override
Definition: TcpAppBase.cc:17
inet::TcpAppBase::socketEstablished
virtual void socketEstablished(TcpSocket *socket) override
Definition: TcpAppBase.cc:113
inet::TcpSocket::LOCALLY_CLOSED
@ LOCALLY_CLOSED
Definition: TcpSocket.h:153
inet::TcpSocket::getState
TcpSocket::State getState() const
Returns the socket state, one of NOT_BOUND, CLOSED, LISTENING, CONNECTING, CONNECTED,...
Definition: TcpSocket.h:218
inet::TcpAppBase::sendPacket
virtual void sendPacket(Packet *pkt)
Definition: TcpAppBase.cc:97
MSGKIND_CONNECT
#define MSGKIND_CONNECT
Definition: TcpBasicClientApp.cc:18
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::TcpAppBase::connect
virtual void connect()
Definition: TcpAppBase.cc:50
inet::TcpAppBase::socket
TcpSocket socket
Definition: TcpAppBase.h:25
inet::TcpAppBase::socketDataArrived
virtual void socketDataArrived(TcpSocket *socket, Packet *msg, bool urgent) override
Notifies about data arrival, packet ownership is transferred to the callee.
Definition: TcpAppBase.cc:119
inet::TcpBasicClientApp::timeoutMsg
cMessage * timeoutMsg
Definition: TcpBasicClientApp.h:23
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::TcpBasicClientApp::earlySend
bool earlySend
Definition: TcpBasicClientApp.h:24
inet::TcpSocket::destroy
virtual void destroy() override
Destroy the connection.
Definition: TcpSocket.cc:186
inet::TcpAppBase::socketFailure
virtual void socketFailure(TcpSocket *socket, int code) override
Definition: TcpAppBase.cc:144
inet::sctp::max
double max(const double a, const double b)
Returns the maximum of a and b.
Definition: SctpAssociation.h:266
inet::TcpSocket::CONNECTED
@ CONNECTED
Definition: TcpSocket.h:153
inet::TcpAppBase::socketClosed
virtual void socketClosed(TcpSocket *socket) override
Definition: TcpAppBase.cc:138
inet::TcpBasicClientApp::sendRequest
virtual void sendRequest()
Definition: TcpBasicClientApp.cc:69
inet::TcpSocket::CONNECTING
@ CONNECTING
Definition: TcpSocket.h:153
inet::TcpSocket::PEER_CLOSED
@ PEER_CLOSED
Definition: TcpSocket.h:153
MSGKIND_SEND
#define MSGKIND_SEND
Definition: TcpBasicClientApp.cc:19
inet::TcpBasicClientApp::rescheduleAfterOrDeleteTimer
virtual void rescheduleAfterOrDeleteTimer(simtime_t d, short int msgKind)
Definition: TcpBasicClientApp.cc:133
inet::TcpAppBase::close
virtual void close()
Definition: TcpAppBase.cc:90