2017-01-19 3 views
0

ホストが複数のホストに送信されるが、すべてではない場合はどうすればよいですか?コードはOmnet ++:inetの複数のホストに送信する方法

//omnetpp.ini 
**.Host1.app.destAddresses = "6e:27:f5:71:ab:11,6e:27:f5:71:ac:12,6e:27:f5:71:ad:13" 

class INET_API EtherTrafGen : public cSimpleModule, public ILifecycle 
{ 
    public: 
    const char *destAddress; 
    bool multipacket; 
    std::vector<std::string> v; 
    unsigned int x; 
} 

void EtherTrafGen::handleMessage(cMessage *msg) 
{ 
    multipacket = true; 
    if (!isNodeUp()) 
     throw cRuntimeError("Application is not running"); 
    if (msg->isSelfMessage()) 
    { 
     const char *destAddresses = par("destAddresses"); 
     if(multipacket) 
     { 
      std::vector<std::string> v = cStringTokenizer(destAddresses).asVector(); 
      for (x = 0; x <= v.size(); x++) 
      { 
       if (msg->getKind() == START) 
         { 
          destMACAddress = resolveDestMACAddress(); 
          // if no dest address given, nothing to do 
          if (destMACAddress.isUnspecified()) 
           return; 
         } 
         sendBurstPackets(); 
         scheduleNextPacket(simTime()); 
      } 
     } 

     else if(!(multipacket)) 
     { 
      if (msg->getKind() == START) 
        { 
         destMACAddress = resolveDestMACAddress(); 
         // if no dest address given, nothing to do 
         if (destMACAddress.isUnspecified()) 
          return; 
        } 
        sendBurstPackets(); 
        scheduleNextPacket(simTime()); 
     } 
    } 
    else 
     receivePacket(check_and_cast<cPacket *>(msg)); 
} 

MACAddress EtherTrafGen::resolveDestMACAddress() 
{ 
    MACAddress destMACAddress; 

    if (multipacket) 
    {destAddress = v[x].c_str();} 
    else if (!multipacket) 
    { destAddress = par("destAddress");} 

    if (destAddress[0]) { 
     if (!destMACAddress.tryParse(destAddress)) { 
      cModule *destStation = getModuleByPath(destAddress); 
      if (!destStation) 
       throw cRuntimeError("..."); 

      cModule *destMAC = destStation->getSubmodule("mac"); 
      if (!destMAC) 
       throw cRuntimeError("...", destAddress); 
      destMACAddress.setAddress(destMAC->par("address")); 
     } 
    } 
    return destMACAddress; 
} 
を次のように私が行っている

//omnetpp.ini  
**.Host1.app.destAddress = "6e:27:f5:71:ab:11" 

void EtherTrafGen::handleMessage(cMessage *msg) 
{ 
if (!isNodeUp()) 
     throw cRuntimeError("Application is not running"); 
    if (msg->isSelfMessage()) 
    { 
     if (msg->getKind() == START) 
     { 
      destMACAddress = resolveDestMACAddress(); 
      if (destMACAddress.isUnspecified()) 
      return; 
      } 
     sendBurstPackets(); 
     scheduleNextPacket(simTime()); 
     } 
    } 
    else 
     receivePacket(check_and_cast<cPacket *>(msg)); 
    } 
} 

MACAddress EtherTrafGen::resolveDestMACAddress() 
{ 
    MACAddress destMACAddress; 
    destAddress = par("destAddress"); 
    if (destAddress[0]) { 
     if (!destMACAddress.tryParse(destAddress)) { 
      cModule *destStation = getModuleByPath(destAddress); 
      if (!destStation) 
       throw cRuntimeError("..."); 
      cModule *destMAC = destStation->getSubmodule("mac"); 
      if (!destMAC) 
       throw cRuntimeError("...", destAddress); 
      destMACAddress.setAddress(destMAC->par("address")); 
     } 
    } 
    return destMACAddress; 
} 

変更した

下記のとおり、私はアプリのモジュールを編集することによって、周りの作業で出しようとしています

**.Host1.app1.destAddress = "6e:27:f5:71:ab:11" 
**.Host1.app2.destAddress = "6e:27:f5:71:ac:12" 
**.Host1.app3.destAddress = "6e:27:f5:71:ad:13" 

結果は、boolのマルチアドレスが前の例のようにfalseであれば正常に動作しますが、動作していれば正常に動作しません真実ですが、エラーもありません。あたかも空のアドレスで上書きされるかのように。

「私は長いコードのためにとても残念ですが、私は私がやっているものに関係している可能性の機能を欠場することを恐れていると私は気付いていないです」あなたはdestAddressesで区切り文字としてコンマを使用している

答えて

1

一方空白(空白、タブ、CR、LF)はデフォルトの区切り文字であるcStringTokenizerです。 したがって、あなたはカンマで行を変更することで、セパレーターであることcStringTokenizerからパーサを知らせる必要があります:あなたはおそらくからvを使用していきのでvの宣言が省略されている

v = cStringTokenizer(destAddresses, ",").asVector(); 

std::vector<std::string> v = cStringTokenizer(destAddresses).asVector(); 

へあなたのクラス(C++ではローカル変数はクラスから同じ名前の変数を扱います)。

+0

他の小さな間違いで変更したことに気付きましたが、各メッセージの後に2番目のメッセージの送信を開始するスケジュールがキャンセルされるという問題があります。これはエラーです ** モジュール(inet :: EtherTrafGen)のエラーイベント1、t = 1のMysimulation.Host1.app(id = 44):scheduleAt():メッセージ(omnetpp :: cMessage)generateNextPacket ** –

+0

は** EtherTrafGen :: scheduleNextPacket **と関連があります –

+1

私は自分の答えを編集しました - あなたのメソッドから 'v'の宣言を削除する必要があります。あなたは 'generateNextPacket'や' scheduleNextPacket'のコードを提示しなかったので、あなたを助けるのは難しいです。さらに、クラスのフィールドを使うのではなく、 'resolveDestMACAddress()'にパラメータを追加することを強くお勧めします。 –

関連する問題