TcpBasicClientApp

Package: inet.applications.tcpapp

simple module TcpBasicClientApp

Client for a generic request-response style protocol over TCP, to be used with TcpGenericServerApp.

The model communicates with the server in sessions. During a session, the client opens a single TCP connection to the server, sends several requests (always waiting for the complete reply to arrive before sending a new request), and closes the connection. Requests and responses are represented by messages of class GenericAppMsg.

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 (Ipv4) and IPv6 (Ipv6).

As an example, the following parameterization can be used as a very rough model of an HTTP session where the client downloads a file, or several files.

numRequestsPerSession = 1 <i>(HTTP 1.0)</i>
numRequestsPerSession = exponential(5) <i>(HTTP 1.1, with keepalive)</i>
requestLength = 1B*int(truncnormal(350,20))
replyLength = 1B*int(exponential(2000))

See also: TcpGenericServerApp, GenericAppMsg, TelnetApp

inet.applications.tcpapp.TcpBasicClientAppTcpBasicClientAppsimple

Inheritance diagram

Extends

Name

Type

Description

SimpleModule

simple module

Base module for all INET simple modules.

Parameters

Name

Type

Default value

Description

displayStringTextFormat

string

“{socketState}”

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

-1

Port number to listen on

connectAddress

string

“”

Server address (may be symbolic)

connectPort

int

1000

Port number to connect to

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

startTime

double

1s

Time the first session begins

stopTime

double

-1s

Time of finishing sending, negative values mean forever

numRequestsPerSession

int

1

Number of requests sent per session

requestLength

int

200B

Length of a request

replyLength

int

1MiB

Length of a reply

thinkTime

double

Time gap between requests

idleInterval

double

Time gap between sessions

reconnectInterval

double

30s

If the connection breaks, wait this long before trying to reconnect

timeToLive

int

-1

If not -1, set the TTL (IPv4) or Hop Limit (IPv6) field of sent packets to this value

dscp

int

-1

If not -1, set the DSCP (IPv4/IPv6) field of sent packets to this value

tos

int

-1

If not -1, set the Type Of Service (IPv4) / Traffic Class (IPv6) field of sent packets to this value

stopOperationExtraTime

double

-1s

Extra time after the lifecycle stop operation finished

stopOperationTimeout

double

2s

Timeout value for the lifecycle stop operation

Properties

Name

Value

Description

class

TcpBasicClientApp

display

i=block/app

lifecycleSupport

Gates

Name

Direction

Size

Description

socketIn

input

socketOut

output

Signals

Name

Type

Unit

Description

connect

long

1 for open, -1 for close

packetReceived

inet::Packet

packetSent

inet::Packet

Statistics

Name

Title

Source

Record

Unit

Interpolation Mode

Description

endToEndDelay

end-to-end delay

dataAge(packetReceived)

histogram,weightedHistogram,vector

s

none

numActiveSessions

number of active sessions

warmup(sum(connect))

max,timeavg,vector

sample-hold

numSessions

total number of sessions

sum(connect+1)/2

last

packetReceived

packets received

packetReceived

count,”sum(packetBytes)”,”vector(packetBytes)”

none

packetSent

packets sent

packetSent

count,”sum(packetBytes)”,”vector(packetBytes)”

none

throughput

throughput of received data

throughput(packetReceived)

vector

bps

Source code

//
// Client for a generic request-response style protocol over TCP, to be used
// with ~TcpGenericServerApp.
//
// The model communicates with the server in sessions. During a session, the
// client opens a single TCP connection to the server, sends several requests
// (always waiting for the complete reply to arrive before sending a new
// request), and closes the connection. Requests and responses are represented
// by messages of class ~GenericAppMsg.
//
// 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 (~Ipv4) and IPv6 (~Ipv6).
//
// As an example, the following parameterization can be used as a very rough
// model of an HTTP session where the client downloads a file, or several files.
//
// <pre>
//    numRequestsPerSession = 1 <i>(HTTP 1.0)</i>
//    numRequestsPerSession = exponential(5) <i>(HTTP 1.1, with keepalive)</i>
//    requestLength = 1B*int(truncnormal(350,20))
//    replyLength = 1B*int(exponential(2000))
// </pre>
//
// @see ~TcpGenericServerApp, ~GenericAppMsg, ~TelnetApp
//
simple TcpBasicClientApp extends SimpleModule like IApp
{
    parameters:
        @class(TcpBasicClientApp);
        displayStringTextFormat = default("{socketState}");
        string localAddress = default(""); // May be left empty ("")
        int localPort = default(-1); // Port number to listen on
        string connectAddress = default("");  // Server address (may be symbolic)
        int connectPort = default(1000); // Port number to connect to
        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 startTime @unit(s) = default(1s); // Time the first session begins
        double stopTime @unit(s) = default(-1s);  // Time of finishing sending, negative values mean forever
        volatile int numRequestsPerSession = default(1);  // Number of requests sent per session
        volatile int requestLength @unit(B) = default(200B); // Length of a request
        volatile int replyLength @unit(B) = default(1MiB); // Length of a reply
        volatile double thinkTime @unit(s); // Time gap between requests
        volatile double idleInterval @unit(s); // Time gap between sessions
        volatile double reconnectInterval @unit(s) = default(30s);  // If the connection breaks, wait this long before trying to reconnect
        int timeToLive = default(-1); // If not -1, set the TTL (IPv4) or Hop Limit (IPv6) field of sent packets to this value
        int dscp = default(-1); // If not -1, set the DSCP (IPv4/IPv6) field of sent packets to this value
        int tos = default(-1); // If not -1, set the Type Of Service (IPv4) / Traffic Class (IPv6) field of sent packets to this value
        @display("i=block/app");
        @lifecycleSupport;
        double stopOperationExtraTime @unit(s) = default(-1s);    // Extra time after the lifecycle stop operation finished
        double stopOperationTimeout @unit(s) = default(2s);    // Timeout value for the lifecycle stop operation
        @signal[packetSent](type=inet::Packet);
        @signal[packetReceived](type=inet::Packet);
        @signal[connect](type=long);  // 1 for open, -1 for close
        @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);
        @statistic[numActiveSessions](title="number of active sessions"; source=warmup(sum(connect)); record=max,timeavg,vector; interpolationmode=sample-hold; autoWarmupFilter=false);
        @statistic[numSessions](title="total number of sessions"; source="sum(connect+1)/2"; record=last);
        @statistic[throughput](title="throughput of received data"; unit=bps; source="throughput(packetReceived)"; record=vector);
    gates:
        input socketIn @labels(TcpCommand/up);
        output socketOut @labels(TcpCommand/down);
}

File: src/inet/applications/tcpapp/TcpBasicClientApp.ned