#include <TCPGenericSrvApp.h>
List of all members.
Detailed Description
Generic server application. It serves requests coming in GenericAppMsg request messages. Clients are usually subclassed from TCPGenericCliAppBase.
- See also:
- GenericAppMsg, TCPGenericCliAppBase
Member Function Documentation
void TCPGenericSrvApp::finish |
( |
| ) |
[protected, virtual] |
{
EV << getFullPath() << ": sent " << bytesSent << " bytes in " << msgsSent << " packets\n";
EV << getFullPath() << ": received " << bytesRcvd << " bytes in " << msgsRcvd << " packets\n";
recordScalar("packets sent", msgsSent);
recordScalar("packets rcvd", msgsRcvd);
recordScalar("bytes sent", bytesSent);
recordScalar("bytes rcvd", bytesRcvd);
}
void TCPGenericSrvApp::handleMessage |
( |
cMessage * |
msg | ) |
[protected, virtual] |
{
if (msg->isSelfMessage())
{
sendBack(msg);
}
else if (msg->getKind()==TCP_I_PEER_CLOSED)
{
msg->setName("close");
msg->setKind(TCP_C_CLOSE);
sendOrSchedule(msg,delay+maxMsgDelay);
}
else if (msg->getKind()==TCP_I_DATA || msg->getKind()==TCP_I_URGENT_DATA)
{
GenericAppMsg *appmsg = dynamic_cast<GenericAppMsg *>(msg);
if (!appmsg)
error("Message (%s)%s is not a GenericAppMsg -- "
"probably wrong client app, or wrong setting of TCP's "
"sendQueueClass/receiveQueueClass parameters "
"(try \"TCPMsgBasedSendQueue\" and \"TCPMsgBasedRcvQueue\")",
msg->getClassName(), msg->getName());
msgsRcvd++;
bytesRcvd += appmsg->getByteLength();
long requestedBytes = appmsg->getExpectedReplyLength();
simtime_t msgDelay = appmsg->getReplyDelay();
if (msgDelay>maxMsgDelay)
maxMsgDelay = msgDelay;
bool doClose = appmsg->getServerClose();
int connId = check_and_cast<TCPCommand *>(appmsg->getControlInfo())->getConnId();
if (requestedBytes==0)
{
delete msg;
}
else
{
delete appmsg->removeControlInfo();
TCPSendCommand *cmd = new TCPSendCommand();
cmd->setConnId(connId);
appmsg->setControlInfo(cmd);
appmsg->setKind(TCP_C_SEND);
appmsg->setByteLength(requestedBytes);
sendOrSchedule(appmsg, delay+msgDelay);
}
if (doClose)
{
cMessage *msg = new cMessage("close");
msg->setKind(TCP_C_CLOSE);
TCPCommand *cmd = new TCPCommand();
cmd->setConnId(connId);
msg->setControlInfo(cmd);
sendOrSchedule(msg, delay+maxMsgDelay);
}
}
else
{
delete msg;
}
if (ev.isGUI())
{
char buf[64];
sprintf(buf, "rcvd: %ld pks %ld bytes\nsent: %ld pks %ld bytes", msgsRcvd, bytesRcvd, msgsSent, bytesSent);
getDisplayString().setTagArg("t",0,buf);
}
}
void TCPGenericSrvApp::initialize |
( |
| ) |
[protected, virtual] |
void TCPGenericSrvApp::sendBack |
( |
cMessage * |
msg | ) |
[protected, virtual] |
Referenced by handleMessage(), and sendOrSchedule().
{
GenericAppMsg *appmsg = dynamic_cast<GenericAppMsg*>(msg);
if (appmsg)
{
msgsSent++;
bytesSent += appmsg->getByteLength();
EV << "sending \"" << appmsg->getName() << "\" to TCP, " << appmsg->getByteLength() << " bytes\n";
}
else
{
EV << "sending \"" << msg->getName() << "\" to TCP\n";
}
send(msg, "tcpOut");
}
void TCPGenericSrvApp::sendOrSchedule |
( |
cMessage * |
msg, |
|
|
simtime_t |
delay |
|
) |
| [protected, virtual] |
Member Data Documentation
The documentation for this class was generated from the following files: