從 UDPApp 或 TCPApp 一堆檔案中,總是要從 xxSinkApp 最先開始看, 最簡單又能猜測到大致流程的一定是這幾個檔案,透過這樣 tracing code 熟悉了大致架構後,看其他相關檔案時會事半功倍.
因為 xxSinkApp 明顯講的都會是如何收到這種類型的封包,還有收到後如何將封包消滅的過程
TCPSinkApp void TCPSinkApp::initialize()
TCPSocket socket; 宣告 TCPSocket
socket.setOutputGate(gate("tcpOut"));
socket.bind(address[0] ? IPAddress (address) : IPAddress (), port); 繫結 "位址 - 埠號"
socket.listen(true);
.... 參考一般 socket 連線相關文件
void TCPSinkApp::handleMessage (cMessage *msg) if (msg->kind ()==TCP_I_PEER_CLOSED) 如果狀態為 TCP_I_PEER_CLOSED
msg->setKind (TCP_C_CLOSE); 將狀態設成 TCP_C_CLOSE
send (msg, "tcpOut"); 將訊息送到 "tcpOut"
else if (msg->kind ()==TCP_I_DATA || msg->kind ()==TCP_I_URGENT_DATA) 如果狀態為 TCP_I_DATA 或 TCP_I_URGENT_DATA
bytesRcvd += msg->length ()/8; bytesRcvd += 收到的封包 bit 長度 / 8 (變成 byte)
delete msg; 並將訊息刪除
else delete msg; 收到其他狀態訊息的話都直接刪除
TCPEchoApp echoFactor=1 will result in sending back the same message unmodified The lengths of the messages are multiplied by echoFactor before sending them back
void TCPEchoApp::sendOrSchedule(cMessage *msg)
if (delay==0) 若 delay 變數值為 0
bytesSent += msg->length ()/8; 紀錄總共送出的封包 byte 長度
send (msg, "tcpOut"); 並送出訊息
else scheduleAt (simTime ()+delay, msg); 否則繼續等待 delay 這段時間
void TCPEchoApp::handleMessage(cMessage *msg)
if (msg->isSelfMessage ()) 若訊息來自本身 紀錄總共送出的封包 byte 長度 並送出訊息
else if (msg->kind ()==TCP_I_PEER_CLOSED) 如果狀態為 TCP_I_PEER_CLOSED
msg->setKind (TCP_C_CLOSE); 將狀態設成 TCP_C_CLOSE
sendOrSchedule (msg); 將訊息傳到 sendOrSchedule () 處理
else if (msg->kind ()==TCP_I_DATA || msg->kind ()==TCP_I_URGENT_DATA) 如果狀態為 TCP_I_DATA 或 TCP_I_URGENT_DATA 紀錄總共收到的封包 byte 長度
if (echoFactor==0) 若 echoFactor==0 將訊息刪除
else 其他: msg->setKind (TCP_C_SEND); 狀態設成 TCP_C_SEND
//reverse direction, modify length, and send it back
TCPCommand ind = check_and_cast<TCPCommand >(msg->removeControlInfo ()); 將 msg 的 ControlInfo 去掉後,強制轉換型別成 TCPCommand
TCPSendCommand *cmd = new TCPSendCommand();
cmd->setConnId(ind->connId()); msg->setControlInfo(cmd);
delete ind; 將不再用到的 ind 刪除
計算回傳訊息大小: long len = long (msg->length ()echoFactor) & ~7U; 將原訊息長度echoFactor
if (len<8) len=8; 若訊息長度小於 1 byte, 補足成 1 byte
msg->setLength (len); 設定回傳訊息長度 sendOrSchedule (msg); 排到 sendOrSchedule () 中
else delete msg; 收到其他狀態訊息的話都直接刪除