TcpEchoApp¶
Package: inet.applications.tcpapp
simple module TcpEchoApp
Accepts any number of incoming TCP connections, and sends back the data that
arrives on them. The echoFactor parameter controls the amount of data to be
sent back. If echoFactor==1, the received data is echoed back without change.
For any other positive value of echoFactor, a message of appropriate length
(datalen*``echoFactor``) without content (see ByteCountChunk C++ class) is sent
back.
The reply can also be delayed by a constant time (echoDelay parameter).
By default, reading from the socket is not rate-limited. To allow rate
limiting, set autoRead=false, and use the readSize and readDelay parameters
to set a rate limit. This will allow TCP flow control to come into effect.
Compatible with both Ipv4 and Ipv6.
Inheritance diagram¶
Extends¶
Name |
Type |
Description |
|---|---|---|
simple module |
Hosts TCP-based server applications. It dynamically creates and launches a new “thread” object for each incoming connection. |
Parameters¶
Name |
Type |
Default value |
Description |
|---|---|---|---|
displayStringTextFormat |
string |
“threads: {numThreads}\nrcvd: {bytesRcvd} bytes\nsent: {bytesSent} bytes” |
Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information |
localAddress |
string |
“” |
May be left empty (“”) |
localPort |
int |
1000 |
Port number to listen on |
serverThreadModuleType |
string |
“inet.applications.tcpapp.TcpEchoAppThread” |
Module type of “thread” module to launch on incoming connections |
stopOperationExtraTime |
double |
-1s |
Extra time after lifecycle stop operation finished |
stopOperationTimeout |
double |
2s |
Timeout value for lifecycle stop operation |
autoRead |
bool |
true |
Whether to use “autoread” or “explicit-read” mode for TCP connection |
readSize |
int |
-1B |
Used only with autoRead==false |
readDelay |
double |
-1s |
Used only with autoRead==false; delay for issuing a READ command after the previous READ was satisfied; -1 means immediately, 0 means zero delay |
echoFactor |
double |
1 |
|
echoDelay |
double |
0s |
Properties¶
Name |
Value |
Description |
|---|---|---|
class |
TcpEchoApp |
|
display |
i=block/app |
|
lifecycleSupport |
Gates¶
Name |
Direction |
Size |
Description |
|---|---|---|---|
socketIn |
input |
||
socketOut |
output |
Signals¶
Name |
Type |
Unit |
Description |
|---|---|---|---|
packetReceived |
|||
packetSent |
Statistics¶
Name |
Title |
Source |
Record |
Unit |
Interpolation Mode |
Description |
|---|---|---|---|---|---|---|
endToEndDelay |
end-to-end delay |
dataAge(packetReceived) |
histogram,weightedHistogram,vector |
s |
none |
|
packetReceived |
packets received |
packetReceived |
count,”sum(packetBytes)”,”vector(packetBytes)” |
none |
||
packetSent |
packets sent |
packetSent |
count,”sum(packetBytes)”,”vector(packetBytes)” |
none |
Source code¶
//
// Accepts any number of incoming TCP connections, and sends back the data that
// arrives on them. The `echoFactor` parameter controls the amount of data to be
// sent back. If echoFactor==1, the received data is echoed back without change.
// For any other positive value of `echoFactor`, a message of appropriate length
// (datalen*`echoFactor`) without content (see `ByteCountChunk` C++ class) is sent
// back.
//
// The reply can also be delayed by a constant time (`echoDelay` parameter).
//
// By default, reading from the socket is not rate-limited. To allow rate
// limiting, set autoRead=false, and use the `readSize` and `readDelay` parameters
// to set a rate limit. This will allow TCP flow control to come into effect.
//
// Compatible with both ~Ipv4 and ~Ipv6.
//
simple TcpEchoApp extends TcpServerHostApp
{
parameters:
@class(TcpEchoApp);
bool autoRead = default(true); // Whether to use "autoread" or "explicit-read" mode for TCP connection
volatile int readSize @unit(B) = default(-1B); // Used only with autoRead==false
volatile double readDelay @unit(s) = default(-1s); // Used only with autoRead==false; delay for issuing a READ command after the previous READ was satisfied; -1 means immediately, 0 means zero delay
double echoFactor = default(1);
double echoDelay @unit(s) = default(0s);
serverThreadModuleType = default("inet.applications.tcpapp.TcpEchoAppThread"); // Module type of the "thread" module to launch on incoming connections
displayStringTextFormat = default("threads: {numThreads}\nrcvd: {bytesRcvd} bytes\nsent: {bytesSent} bytes");
@signal[packetSent](type=inet::Packet);
@signal[packetReceived](type=inet::Packet);
@statistic[packetReceived](title="packets received"; source=packetReceived; record=count,"sum(packetBytes)","vector(packetBytes)"; interpolationmode=none);
@statistic[packetSent](title="packets sent"; source=packetSent; record=count,"sum(packetBytes)","vector(packetBytes)"; interpolationmode=none);
@statistic[endToEndDelay](title="end-to-end delay"; source="dataAge(packetReceived)"; unit=s; record=histogram,weightedHistogram,vector; interpolationmode=none);
}