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

Single-connection TCP application. More...

#include <TcpSessionApp.h>

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

Classes

struct  Command
 

Public Member Functions

 TcpSessionApp ()
 
virtual ~TcpSessionApp ()
 
- 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 Types

typedef std::vector< CommandCommandVector
 
- Protected Types inherited from inet::OperationalMixin< cSimpleModule >
enum  State
 

Protected Member Functions

virtual void handleStartOperation (LifecycleOperation *operation) override
 
virtual void handleStopOperation (LifecycleOperation *operation) override
 
virtual void handleCrashOperation (LifecycleOperation *operation) override
 
virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void finish () override
 
virtual void refreshDisplay () const override
 
virtual void parseScript (const char *script)
 
virtual PacketcreateDataPacket (long sendBytes)
 
virtual void sendData ()
 
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
 
- Protected Member Functions inherited from inet::TcpAppBase
virtual void handleMessageWhenUp (cMessage *msg) override
 
virtual void connect ()
 
virtual void close ()
 
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

CommandVector commands
 
bool activeOpen = false
 
simtime_t tOpen
 
simtime_t tSend
 
simtime_t tClose
 
int sendBytes = 0
 
int commandIndex = -1
 
cMessage * timeoutMsg = nullptr
 
- 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

- Static Protected Attributes inherited from inet::TcpAppBase
static simsignal_t connectSignal = registerSignal("connect")
 

Detailed Description

Single-connection TCP application.

Member Typedef Documentation

◆ CommandVector

typedef std::vector<Command> inet::TcpSessionApp::CommandVector
protected

Constructor & Destructor Documentation

◆ TcpSessionApp()

inet::TcpSessionApp::TcpSessionApp ( )
inline
64 {}

◆ ~TcpSessionApp()

inet::TcpSessionApp::~TcpSessionApp ( )
virtual
29 {
30  cancelAndDelete(timeoutMsg);
31 }

Member Function Documentation

◆ createDataPacket()

Packet * inet::TcpSessionApp::createDataPacket ( long  sendBytes)
protectedvirtual
120 {
121  const char *dataTransferMode = par("dataTransferMode");
122  Ptr<Chunk> payload;
123  if (!strcmp(dataTransferMode, "bytecount")) {
124  payload = makeShared<ByteCountChunk>(B(sendBytes));
125  }
126  else if (!strcmp(dataTransferMode, "object")) {
127  const auto& applicationPacket = makeShared<ApplicationPacket>();
128  applicationPacket->setChunkLength(B(sendBytes));
129  payload = applicationPacket;
130  }
131  else if (!strcmp(dataTransferMode, "bytestream")) {
132  const auto& bytesChunk = makeShared<BytesChunk>();
133  std::vector<uint8_t> vec;
134  vec.resize(sendBytes);
135  for (int i = 0; i < sendBytes; i++)
136  vec[i] = (bytesSent + i) & 0xFF;
137  bytesChunk->setBytes(vec);
138  payload = bytesChunk;
139  }
140  else
141  throw cRuntimeError("Invalid data transfer mode: %s", dataTransferMode);
142  payload->addTag<CreationTimeTag>()->setCreationTime(simTime());
143  Packet *packet = new Packet("data1");
144  packet->insertAtBack(payload);
145  return packet;
146 }

Referenced by sendData().

◆ finish()

void inet::TcpSessionApp::finish ( )
overrideprotectedvirtual

Reimplemented from inet::TcpAppBase.

231 {
232  EV << getFullPath() << ": received " << bytesRcvd << " bytes in " << packetsRcvd << " packets\n";
233  recordScalar("bytesRcvd", bytesRcvd);
234  recordScalar("bytesSent", bytesSent);
235 }

◆ handleCrashOperation()

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

Implements inet::OperationalMixin< cSimpleModule >.

74 {
75  cancelEvent(timeoutMsg);
76  if (operation->getRootModule() != getContainingNode(this))
77  socket.destroy();
78 }

◆ handleStartOperation()

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

Implements inet::OperationalMixin< cSimpleModule >.

58 {
59  if (simTime() <= tOpen) {
60  timeoutMsg->setKind(MSGKIND_CONNECT);
61  scheduleAt(tOpen, timeoutMsg);
62  }
63 }

◆ handleStopOperation()

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

Implements inet::OperationalMixin< cSimpleModule >.

66 {
67  cancelEvent(timeoutMsg);
68  if (socket.isOpen())
69  close();
70  delayActiveOperationFinish(par("stopOperationTimeout"));
71 }

◆ handleTimer()

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

Implements inet::TcpAppBase.

81 {
82  switch (msg->getKind()) {
83  case MSGKIND_CONNECT:
84  if (activeOpen)
85  connect(); // sending will be scheduled from socketEstablished()
86  else
87  throw cRuntimeError("TODO");
88  break;
89 
90  case MSGKIND_SEND:
91  sendData();
92  break;
93 
94  case MSGKIND_CLOSE:
95  close();
96  break;
97 
98  default:
99  throw cRuntimeError("Invalid timer msg: kind=%d", msg->getKind());
100  }
101 }

◆ initialize()

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

Reimplemented from inet::TcpAppBase.

34 {
36  if (stage == INITSTAGE_LOCAL) {
37  activeOpen = par("active");
38  tOpen = par("tOpen");
39  tSend = par("tSend");
40  tClose = par("tClose");
41  sendBytes = par("sendBytes");
42  commandIndex = 0;
43 
44  const char *script = par("sendScript");
45  parseScript(script);
46 
47  if (sendBytes > 0 && commands.size() > 0)
48  throw cRuntimeError("Cannot use both sendScript and tSend+sendBytes");
49  if (sendBytes > 0)
50  commands.push_back(Command(tSend, sendBytes));
51  if (commands.size() == 0)
52  throw cRuntimeError("sendScript is empty");
53  timeoutMsg = new cMessage("timer");
54  }
55 }

◆ numInitStages()

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

Reimplemented from inet::TcpAppBase.

48 { return NUM_INIT_STAGES; }

◆ parseScript()

void inet::TcpSessionApp::parseScript ( const char *  script)
protectedvirtual
178 {
179  const char *s = script;
180 
181  EV_DEBUG << "parse script \"" << script << "\"\n";
182  while (*s) {
183  // parse time
184  while (isspace(*s))
185  s++;
186 
187  if (!*s || *s == ';')
188  break;
189 
190  const char *s0 = s;
191  simtime_t tSend = strtod(s, &const_cast<char *&>(s));
192 
193  if (s == s0)
194  throw cRuntimeError("Syntax error in script: simulation time expected");
195 
196  // parse number of bytes
197  while (isspace(*s))
198  s++;
199 
200  if (!isdigit(*s))
201  throw cRuntimeError("Syntax error in script: number of bytes expected");
202 
203  long numBytes = strtol(s, nullptr, 10);
204 
205  while (isdigit(*s))
206  s++;
207 
208  // add command
209  EV_DEBUG << " add command (" << tSend << "s, " << numBytes << "B)\n";
210  commands.push_back(Command(tSend, numBytes));
211 
212  // skip delimiter
213  while (isspace(*s))
214  s++;
215 
216  if (!*s)
217  break;
218 
219  if (*s != ';')
220  throw cRuntimeError("Syntax error in script: separator ';' missing");
221 
222  s++;
223 
224  while (isspace(*s))
225  s++;
226  }
227  EV_DEBUG << "parser finished\n";
228 }

Referenced by initialize().

◆ refreshDisplay()

void inet::TcpSessionApp::refreshDisplay ( ) const
overrideprotectedvirtual

Reimplemented from inet::TcpAppBase.

238 {
240 
241  std::ostringstream os;
242  os << TcpSocket::stateName(socket.getState()) << "\nsent: " << bytesSent << " bytes\nrcvd: " << bytesRcvd << " bytes";
243  getDisplayString().setTagArg("t", 0, os.str().c_str());
244 }

◆ sendData()

void inet::TcpSessionApp::sendData ( )
protectedvirtual
104 {
105  long numBytes = commands[commandIndex].numBytes;
106  EV_INFO << "sending data with " << numBytes << " bytes\n";
107  sendPacket(createDataPacket(numBytes));
108 
109  if (++commandIndex < (int)commands.size()) {
110  simtime_t tSend = commands[commandIndex].tSend;
111  scheduleAt(std::max(tSend, simTime()), timeoutMsg);
112  }
113  else {
114  timeoutMsg->setKind(MSGKIND_CLOSE);
115  scheduleAt(std::max(tClose, simTime()), timeoutMsg);
116  }
117 }

Referenced by handleTimer().

◆ socketClosed()

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

Reimplemented from inet::TcpAppBase.

164 {
166  cancelEvent(timeoutMsg);
167  if (operationalState == State::STOPPING_OPERATION && !this->socket.isOpen())
168  startActiveOperationExtraTimeOrFinish(par("stopOperationExtraTime"));
169 }

◆ socketDataArrived()

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

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

Reimplemented from inet::TcpAppBase.

159 {
161 }

◆ socketEstablished()

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

Reimplemented from inet::TcpAppBase.

149 {
151 
152  ASSERT(commandIndex == 0);
153  timeoutMsg->setKind(MSGKIND_SEND);
154  simtime_t tSend = commands[commandIndex].tSend;
155  scheduleAt(std::max(tSend, simTime()), timeoutMsg);
156 }

◆ socketFailure()

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

Reimplemented from inet::TcpAppBase.

172 {
174  cancelEvent(timeoutMsg);
175 }

Member Data Documentation

◆ activeOpen

bool inet::TcpSessionApp::activeOpen = false
protected

Referenced by handleTimer(), and initialize().

◆ commandIndex

int inet::TcpSessionApp::commandIndex = -1
protected

◆ commands

CommandVector inet::TcpSessionApp::commands
protected

◆ sendBytes

int inet::TcpSessionApp::sendBytes = 0
protected

Referenced by createDataPacket(), and initialize().

◆ tClose

simtime_t inet::TcpSessionApp::tClose
protected

Referenced by initialize(), and sendData().

◆ timeoutMsg

◆ tOpen

simtime_t inet::TcpSessionApp::tOpen
protected

Referenced by handleStartOperation(), and initialize().

◆ tSend

simtime_t inet::TcpSessionApp::tSend
protected

The documentation for this class was generated from the following files:
MSGKIND_SEND
#define MSGKIND_SEND
Definition: TcpSessionApp.cc:25
inet::OperationalMixin< cSimpleModule >::operationalState
State operationalState
Definition: OperationalMixin.h:23
inet::TcpSessionApp::parseScript
virtual void parseScript(const char *script)
Definition: TcpSessionApp.cc:177
inet::TcpSocket::stateName
static const char * stateName(TcpSocket::State state)
Returns name of socket state code returned by getState().
Definition: TcpSocket.cc:372
inet::getContainingNode
cModule * getContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:40
inet::TcpSocket::isOpen
virtual bool isOpen() const override
Definition: TcpSocket.cc:257
inet::TcpAppBase::initialize
virtual void initialize(int stage) override
Definition: TcpAppBase.cc:17
MSGKIND_CLOSE
#define MSGKIND_CLOSE
Definition: TcpSessionApp.cc:26
inet::TcpSessionApp::createDataPacket
virtual Packet * createDataPacket(long sendBytes)
Definition: TcpSessionApp.cc:119
inet::TcpSessionApp::timeoutMsg
cMessage * timeoutMsg
Definition: TcpSessionApp.h:41
inet::TcpAppBase::socketEstablished
virtual void socketEstablished(TcpSocket *socket) override
Definition: TcpAppBase.cc:113
inet::TcpSessionApp::tClose
simtime_t tClose
Definition: TcpSessionApp.h:36
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
inet::TcpSessionApp::tSend
simtime_t tSend
Definition: TcpSessionApp.h:35
inet::units::values::s
value< double, units::s > s
Definition: Units.h:1235
inet::TcpSessionApp::sendData
virtual void sendData()
Definition: TcpSessionApp.cc:103
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::bytesSent
int bytesSent
Definition: TcpAppBase.h:32
inet::TcpAppBase::socket
TcpSocket socket
Definition: TcpAppBase.h:25
inet::TcpAppBase::refreshDisplay
virtual void refreshDisplay() const override
Definition: TcpAppBase.cc:107
inet::TcpSessionApp::sendBytes
int sendBytes
Definition: TcpSessionApp.h:37
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::TcpSessionApp::commandIndex
int commandIndex
Definition: TcpSessionApp.h:40
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::TcpSessionApp::commands
CommandVector commands
Definition: TcpSessionApp.h:31
inet::TcpSessionApp::tOpen
simtime_t tOpen
Definition: TcpSessionApp.h:34
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
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::OperationalMixin< cSimpleModule >::delayActiveOperationFinish
virtual void delayActiveOperationFinish(simtime_t timeout)
Definition: OperationalMixinImpl.h:161
inet::OperationalMixin< cSimpleModule >::startActiveOperationExtraTimeOrFinish
virtual void startActiveOperationExtraTimeOrFinish(simtime_t extraTime)
Definition: OperationalMixinImpl.h:179
inet::TcpAppBase::socketClosed
virtual void socketClosed(TcpSocket *socket) override
Definition: TcpAppBase.cc:138
inet::TcpAppBase::bytesRcvd
int bytesRcvd
Definition: TcpAppBase.h:33
inet::TcpAppBase::close
virtual void close()
Definition: TcpAppBase.cc:90
inet::TcpSessionApp::activeOpen
bool activeOpen
Definition: TcpSessionApp.h:33
MSGKIND_CONNECT
#define MSGKIND_CONNECT
Definition: TcpSessionApp.cc:24
inet::TcpAppBase::packetsRcvd
int packetsRcvd
Definition: TcpAppBase.h:31