00060 {
00061 if (msg->isSelfMessage())
00062 {
00063 sendBack(msg);
00064 }
00065 else if (msg->kind()==TCP_I_PEER_CLOSED)
00066 {
00067
00068
00069 msg->setName("close");
00070 msg->setKind(TCP_C_CLOSE);
00071 sendOrSchedule(msg,delay+maxMsgDelay);
00072 }
00073 else if (msg->kind()==TCP_I_DATA || msg->kind()==TCP_I_URGENT_DATA)
00074 {
00075 msgsRcvd++;
00076 bytesRcvd += msg->byteLength();
00077
00078 GenericAppMsg *appmsg = dynamic_cast<GenericAppMsg *>(msg);
00079 if (!appmsg)
00080 error("Message (%s)%s is not a GenericAppMsg -- "
00081 "probably wrong client app, or wrong setting of TCP's "
00082 "sendQueueClass/receiveQueueClass parameters "
00083 "(try \"TCPMsgBasedSendQueue\" and \"TCPMsgBasedRcvQueue\")",
00084 msg->className(), msg->name());
00085
00086 long requestedBytes = appmsg->expectedReplyLength();
00087
00088 simtime_t msgDelay = appmsg->replyDelay();
00089 if (msgDelay>maxMsgDelay)
00090 maxMsgDelay = msgDelay;
00091
00092 bool doClose = appmsg->close();
00093 int connId = check_and_cast<TCPCommand *>(msg->controlInfo())->connId();
00094
00095 if (requestedBytes==0)
00096 {
00097 delete msg;
00098 }
00099 else
00100 {
00101 delete msg->removeControlInfo();
00102 TCPSendCommand *cmd = new TCPSendCommand();
00103 cmd->setConnId(connId);
00104 msg->setControlInfo(cmd);
00105
00106
00107 msg->setKind(TCP_C_SEND);
00108 msg->setByteLength(requestedBytes);
00109 sendOrSchedule(msg, delay+msgDelay);
00110 }
00111
00112 if (doClose)
00113 {
00114 cMessage *msg = new cMessage("close");
00115 msg->setKind(TCP_C_CLOSE);
00116 TCPCommand *cmd = new TCPCommand();
00117 cmd->setConnId(connId);
00118 msg->setControlInfo(cmd);
00119 sendOrSchedule(msg, delay+maxMsgDelay);
00120 }
00121 }
00122 else
00123 {
00124
00125 delete msg;
00126 }
00127
00128 if (ev.isGUI())
00129 {
00130 char buf[64];
00131 sprintf(buf, "rcvd: %ld pks %ld bytes\nsent: %ld pks %ld bytes", msgsRcvd, bytesRcvd, msgsSent, bytesSent);
00132 displayString().setTagArg("t",0,buf);
00133 }
00134 }