TcpEchoApp.ned

NED File src/inet/applications/tcpapp/TcpEchoApp.ned

Name Type Description
TcpEchoApp simple module

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.

TcpEchoAppThread simple module

Thread for ~TcpEchoApp

Source code

//
// Copyright (C) 2004 OpenSim Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//


package inet.applications.tcpapp;

import inet.common.SimpleModule;

//
// 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
        @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);
}

// Thread for ~TcpEchoApp
simple TcpEchoAppThread extends SimpleModule
{
    parameters:
        @class(TcpEchoAppThread);
        @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);
}