//-------------------------------------------------------------
// file: client.cc
// (part of DYNA - an OMNeT++ demo simulation)
//-------------------------------------------------------------
#include "dyna.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" );
cMessage *conn_req, *conn_ack, *query, *answer, *disc_req, *disc_ack;
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 CONN_REQ\n";
conn_req = new cMessage( "CONN_REQ", CONN_REQ );
conn_req->addPar("src") = own_addr;
conn_req->addPar("dest") = server_addr;
send( conn_req, "out" );
ev << "waiting for CONN_ACK\n";
conn_ack = receive( timeout );
if (conn_ack==NULL)
goto broken;
serverproc_id = conn_ack->par("serverproc_id");
ev << "got 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 cMessage( "DATA(query)", DATA_QUERY );
query->addPar("src") = own_addr;
query->addPar("dest") = server_addr;
query->addPar("serverproc_id") = serverproc_id;
send( query, "out" );
ev << "waiting for DATA(result)\n";
answer = receive( timeout );
if (answer==NULL)
goto broken;
ev << "got DATA(result)\n";
delete answer;
wait( (double)query_ia_time );
}
// connection teardown
ev << "sending DISC_REQ\n";
disc_req = new cMessage( "DISC_REQ", DISC_REQ );
disc_req->addPar("src") = own_addr;
disc_req->addPar("dest") = server_addr;
disc_req->addPar("serverproc_id") = serverproc_id;
send( disc_req, "out" );
ev << "waiting for DISC_ACK\n";
disc_ack = receive( timeout );
if (disc_ack==NULL)
goto broken;
ev << "got DISC_ACK\n";
delete disc_ack;
continue;
// error handling
broken: ev << "Timeout, connection broken!\n";
}
}
syntax highlighted by Code2HTML, v. 0.9.1