2015-09-07 27 views
0

我在Omnet ++中製作了兩個不同的TCP應用程序,一個是TCPBasicClientApp,另一個是TCPGenericServerApp。 TCP客戶端應用程序通過TCP協議成功發送GenericAppMsg。一旦在服務器端收到消息(使用特定的replyLength),它將通過SendBack()方法(在inet示例應用程序中也提到)將其發送回客戶端。如何通過omnet ++中的TCPBasicClientApp接收消息?

我的問題是,如何在客戶端接收此消息?

這裏是omnet.ini文件的代碼,這種轉移,

客戶端,

**.host[0].numTcpApps = 1 
**.host[0].tcpApp[0].typename = "ReputationAlgorithmApplication" 
**.host[0].tcpApp[0].localAddress = "" 
**.host[0].tcpApp[0].localPort = -1 
**.host[0].tcpApp[0].connectAddress = "host[3]" 
**.host[0].tcpApp[0].connectPort = 2000 
**.host[0].tcpApp[0].dataTransferMode = "object" 

服務器端,

**.host[3].numTcpApps = 1 
**.host[3].tcpApp[*].typename = "ReputationServerApplication" 
**.host[3].tcpApp[*].localAddress = "host[3]" 
**.host[3].tcpApp[*].localPort = 2000 

這裏是服務器上的sendBack方法邊,

void ReputationServerApplication::sendBack(cMessage *msg) { 
    cPacket *packet = dynamic_cast<cPacket *>(msg); 

    if (packet) { 
     msgsSent++; 
     bytesSent += packet->getByteLength(); 
     emit(sentPkSignal, packet); 

     EV_INFO << "sending \"" << packet->getName() << "\" to TCP, " 
         << packet->getByteLength() << " bytes\n"; 
    } else { 
     EV_INFO << "sending \"" << msg->getName() << "\" to TCP\n"; 
    } 
    DummyMessageForReputation *msgDum = 
      dynamic_cast<DummyMessageForReputation *>(msg); 
    std::cout << "\n Tested: Message with the string " 
      << msgDum->getMessageString() << " is sending back to " 
      << msgDum->getNodeName(); 

    send(msgDum, "tcpOut"); 
} 

任何幫助,將不勝感激。

回答

1

您可以使用TCPBasicClientApp::socketDataArrived()來處理客戶端收到的消息。

+0

是的,這就是我所做的,但這裏的問題是它不是從每個節點接收。所以情況就是這樣,我有一個由10個節點組成的無線Mesh網絡......五個節點,向其他五個節點發送一條消息,接收方應該接收該消息並向發送方回覆相同的消息。我可以使用SocketDataArrived()從5中檢索3條消息。 由於某些原因,來自兩個節點的消息正在從接收方發回,但無法在socketDataArrived()處獲取。 –

+0

由於無線環境(如數據包衝突)或接收信噪比不滿足無線電要求等原因,很多原因可能導致此問題。您可以使用step模式來查找丟棄了哪個模塊,然後逐行調試源代碼以準確找到問題所在? –

+0

一行一行地調試代碼對我來說幾乎是不可能的,因爲我在Mac OSX Yosemite上使用了Omnet ++,並且沒有可用於此的gdb版本,因此無需調試!如果我可以調試就不會有問題。 我同意你說,很多原因可以導致這個問題,但我不是移動節點的位置,也是每個節點都在其他節點的範圍內。我能想到的唯一原因是數據包衝突,可能是我需要爲此調整一些無線參數。 謝謝你的幫助。 –