ホストが複数のホストに送信されるが、すべてではない場合はどうすればよいですか?コードは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
で区切り文字としてコンマを使用している
他の小さな間違いで変更したことに気付きましたが、各メッセージの後に2番目のメッセージの送信を開始するスケジュールがキャンセルされるという問題があります。これはエラーです ** モジュール(inet :: EtherTrafGen)のエラーイベント1、t = 1のMysimulation.Host1.app(id = 44):scheduleAt():メッセージ(omnetpp :: cMessage)generateNextPacket ** –
は** EtherTrafGen :: scheduleNextPacket **と関連があります –
私は自分の答えを編集しました - あなたのメソッドから 'v'の宣言を削除する必要があります。あなたは 'generateNextPacket'や' scheduleNextPacket'のコードを提示しなかったので、あなたを助けるのは難しいです。さらに、クラスのフィールドを使うのではなく、 'resolveDestMACAddress()'にパラメータを追加することを強くお勧めします。 –