//-------------------------------------------------------------
// file: client.cc
//        (part of DYNA - an OMNeT++ demo simulation)
//-------------------------------------------------------------

#include "dynapacket_m.h"

class Client : public cSimpleModule
{
    Module_Class_Members(Client,cSimpleModule,16384)
    virtual void activity();
};

Define_Module( Client );

void Client::activity()
{
    // query module parameters
    double timeout = par( "timeout" );
    cPar& connection_ia_time = par( "conn_ia_time" );
    cPar& query_ia_time = par( "query_ia_time" );
    cPar& num_query = par( "num_query" );

    DynaPacket *conn_req, *conn_ack, *disc_req, *disc_ack;
    DynaDataPacket *query, *answer;
    int act_num_query=0, i=0;
    WATCH(act_num_query); WATCH(i);

    // assign address: index of Switch's gate to which we are connected
    int own_addr = gate("out")->toGate()->index();
    int server_addr = gate("out")->toGate()->size()-1;
    int serverproc_id = 0;
    WATCH(own_addr); WATCH(server_addr); WATCH(serverproc_id);

    for(;;)
    {
        // keep an interval between subsequent connections
        wait( (double)connection_ia_time );

        // connection setup
        ev << "sending DYNA_CONN_REQ\n";
        conn_req = new DynaPacket("DYNA_CONN_REQ", DYNA_CONN_REQ);
        conn_req->setSrcAddress(own_addr);
        conn_req->setDestAddress(server_addr);
        send( conn_req, "out" );

        ev << "waiting for DYNA_CONN_ACK\n";
        conn_ack = (DynaPacket *) receive( timeout );
        if (conn_ack==NULL)
            goto broken;
        serverproc_id = conn_ack->getServerProcId();
        ev << "got DYNA_CONN_ACK, my server process is ID="
           << serverproc_id << endl;
        delete conn_ack;

        // communication
        act_num_query = (long)num_query;
        for (i=0; i<act_num_query; i++)
        {
            ev << "sending DATA(query)\n";
            query = new DynaDataPacket("DATA(query)", DYNA_DATA);
            query->setSrcAddress(own_addr);
            query->setDestAddress(server_addr);
            query->setServerProcId(serverproc_id);
            query->setPayload("query");
            send(query, "out");

            ev << "waiting for DATA(result)\n";
            answer = (DynaDataPacket *) receive( timeout );
            if (answer==NULL)
                 goto broken;
            ev << "got DATA(result)\n";
            delete answer;

            wait( (double)query_ia_time );
        }

        // connection teardown
        ev << "sending DYNA_DISC_REQ\n";
        disc_req = new DynaPacket("DYNA_DISC_REQ", DYNA_DISC_REQ);
        disc_req->setSrcAddress(own_addr);
        disc_req->setDestAddress(server_addr);
        disc_req->setServerProcId(serverproc_id);
        send(disc_req, "out");

        ev << "waiting for DYNA_DISC_ACK\n";
        disc_ack = (DynaPacket *) receive( timeout );
        if (disc_ack==NULL)
            goto broken;
        ev << "got DYNA_DISC_ACK\n";
        delete disc_ack;

        continue;

        // error handling
        broken: ev << "Timeout, connection broken!\n";
    }
}



syntax highlighted by Code2HTML, v. 0.9.1