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

#include "dynapacket_m.h"

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

Define_Module( ServerProcess );

void ServerProcess::activity()
{
    // retrieve parameters
    cPar& processing_time = parentModule()->par("processing_time");

    int client_addr=0, own_addr=0;
    WATCH(client_addr); WATCH(own_addr);

    DynaPacket *pk;
    DynaDataPacket *datapk;

    // receive the CONN_REQ we were created to handle
    ev << "Started, waiting for DYNA_CONN_REQ\n";
    pk = (DynaPacket *) receive();
    client_addr = pk->getSrcAddress();
    own_addr = pk->getDestAddress();

    // set the module name to something informative
    char buf[30];
    sprintf(buf, "serverproc%d-clientaddr%d", id(), client_addr);
    setName(buf);

    // respond to CONN_REQ by CONN_ACK
    ev << "client is addr=" << client_addr << ", sending DYNA_CONN_ACK\n";
    pk->setName("DYNA_CONN_ACK");
    pk->setKind(DYNA_CONN_ACK);
    pk->setSrcAddress(own_addr);
    pk->setDestAddress(client_addr);
    pk->setServerProcId(id());
    send(pk, "out");

    // process data packets until DISC_REQ comes
    for(;;)
    {
        ev << "waiting for DATA(query) (or DYNA_DISC_REQ)\n";
        pk = (DynaPacket *) receive();
        int type = pk->kind();

        if (type==DYNA_DISC_REQ)
            break;

        if (type!=DYNA_DATA)
            error("protocol error!");

        datapk = (DynaDataPacket *) pk;

        ev << "got DATA(query), processing...\n";
        wait( (double)processing_time );

        ev << "sending DATA(result)\n";
        datapk->setName("DATA(result)");
        datapk->setKind(DYNA_DATA);
        datapk->setSrcAddress(own_addr);
        datapk->setDestAddress(client_addr);
        datapk->setPayload("result");
        send(datapk, "out");
    }

    // connection teardown in response to DISC_REQ
    ev << "got DYNA_DISC_REQ, sending DYNA_DISC_ACK\n";
    pk->setName("DYNA_DISC_ACK");
    pk->setKind(DYNA_DISC_ACK);
    pk->setSrcAddress(own_addr);
    pk->setDestAddress(client_addr);
    send(pk, "out");

    ev << "exiting\n";
    pk->setName("DYNA_DISC_ACK" );
    deleteModule();
}



syntax highlighted by Code2HTML, v. 0.9.1