INET Framework for OMNeT++/OMNEST
TCPEchoApp Class Reference

#include <TCPEchoApp.h>

List of all members.

Protected Member Functions

virtual void sendDown (cMessage *msg)
virtual void initialize ()
virtual void handleMessage (cMessage *msg)
virtual void finish ()

Protected Attributes

simtime_t delay
double echoFactor
long bytesRcvd
long bytesSent

Detailed Description

Accepts any number of incoming connections, and sends back whatever arrives on them.


Member Function Documentation

void TCPEchoApp::finish ( ) [protected, virtual]
{
    recordScalar("bytesRcvd", bytesRcvd);
    recordScalar("bytesSent", bytesSent);
}
void TCPEchoApp::handleMessage ( cMessage *  msg) [protected, virtual]
{
    if (msg->isSelfMessage())
    {
        sendDown(msg);
    }
    else if (msg->getKind()==TCP_I_PEER_CLOSED)
    {
        // we'll close too
        msg->setKind(TCP_C_CLOSE);
        if (delay==0)
            sendDown(msg);
        else
            scheduleAt(simTime()+delay, msg); // send after a delay
    }
    else if (msg->getKind()==TCP_I_DATA || msg->getKind()==TCP_I_URGENT_DATA)
    {
        cPacket *pkt = check_and_cast<cPacket *>(msg);
        bytesRcvd += pkt->getByteLength();

        if (echoFactor==0)
        {
            delete pkt;
        }
        else
        {
            // reverse direction, modify length, and send it back
            pkt->setKind(TCP_C_SEND);
            TCPCommand *ind = check_and_cast<TCPCommand *>(pkt->removeControlInfo());
            TCPSendCommand *cmd = new TCPSendCommand();
            cmd->setConnId(ind->getConnId());
            pkt->setControlInfo(cmd);
            delete ind;

            long byteLen = pkt->getByteLength()*echoFactor;
            if (byteLen<1) byteLen=1;
            pkt->setByteLength(byteLen);

            if (delay==0)
                sendDown(pkt);
            else
                scheduleAt(simTime()+delay, pkt); // send after a delay
        }
    }
    else
    {
        // some indication -- ignore
        delete msg;
    }

    if (ev.isGUI())
    {
        char buf[80];
        sprintf(buf, "rcvd: %ld bytes\nsent: %ld bytes", bytesRcvd, bytesSent);
        getDisplayString().setTagArg("t",0,buf);
    }
}
void TCPEchoApp::initialize ( ) [protected, virtual]
{
    const char *address = par("address");
    int port = par("port");
    delay = par("echoDelay");
    echoFactor = par("echoFactor");

    bytesRcvd = bytesSent = 0;
    WATCH(bytesRcvd);
    WATCH(bytesSent);

    TCPSocket socket;
    socket.setOutputGate(gate("tcpOut"));
    socket.bind(address[0] ? IPvXAddress(address) : IPvXAddress(), port);
    socket.listen();
}
void TCPEchoApp::sendDown ( cMessage *  msg) [protected, virtual]

Referenced by handleMessage().

{
    if (msg->isPacket())
        bytesSent += ((cPacket *)msg)->getByteLength();
    send(msg, "tcpOut");
}

Member Data Documentation

long TCPEchoApp::bytesRcvd [protected]

Referenced by finish(), handleMessage(), and initialize().

long TCPEchoApp::bytesSent [protected]
simtime_t TCPEchoApp::delay [protected]

Referenced by handleMessage(), and initialize().

double TCPEchoApp::echoFactor [protected]

Referenced by handleMessage(), and initialize().


The documentation for this class was generated from the following files: