#omnet #inet
#omnet #inet
Вопрос:
Я пытаюсь создать новое UDP-приложение, с помощью которого я могу управлять процессом генерации пакетов и процессом отправки пакетов, т. Е. у меня есть отдельные параметры для генерации пакетов и интервала отправки.
Когда я запускаю код, получаю следующие ошибки:
inet / applications /udpapp /UdpOwnApp.cc:134:29: ошибка: нет функции сопоставления для вызова очереди ‘omnetpp::cQueue::insert(const inet::IntrusivePtrinet::ApplicationPacketamp;)’.вставка (полезная нагрузка); ^ inet/applications/udpapp /UdpOwnApp.cc:157:15: ошибка: ‘полезная нагрузка’ не была объявлена в этой области queue.pop(полезная нагрузка); ^~~~~~~
Фрагмент кода приведен ниже:
void UdpOwnApp::generatePacket()
{
const autoamp; payload = makeShared<ApplicationPacket>();
payload->setChunkLength(B(par("messageLength")));
payload->setSequenceNumber(numGenerate);
payload->addTag<CreationTimeTag>()->setCreationTime(simTime());
queue.insert(payload);
simtime_t d = simTime() par("generateInterval");
if (stopTime < SIMTIME_ZERO || d < stopTime) {
selfMsg->setKind(GENERATE);
scheduleAt(d, selfMsg);
}
else {
selfMsg->setKind(STOP);
scheduleAt(stopTime, selfMsg);
}
}
void UdpOwnApp::sendPacket()
{
std::ostringstream str;
str << packetName << "-" << numSent;
Packet *packet = new Packet(str.str().c_str());
if(dontFragment)
packet->addTag<FragmentationReq>()->setDontFragment(true);
queue.pop(payload);
packet->insertAtBack(payload);
L3Address destAddr = chooseDestAddr();
emit(packetSentSignal, packet);
socket.sendTo(packet, destAddr, destPort);
numSent ;
}
Кто-нибудь подскажет, верен ли код и как устранить ошибки?
Спасибо
Ответ №1:
Объявление insert()
выглядит следующим образом:
virtual void insert(cObject *obj);
Поэтому нельзя передать другой объект, который cObject
или производный класс. Вы можете использовать экземпляр Packet
, поскольку он наследуется от cObject
. Таким образом, код может выглядеть следующим образом:
void UdpOwnApp::generatePacket() {
const autoamp; payload = makeShared<ApplicationPacket>();
payload->setChunkLength(B(par("messageLength")));
payload->setSequenceNumber(numGenerate);
payload->addTag<CreationTimeTag>()->setCreationTime(simTime());
std::ostringstream str;
str << packetName << "-" << numSent;
Packet *packet = new Packet(str.str().c_str());
packet->insertAtBack(payload);
queue.insert(packet);
simtime_t d = simTime() par("generateInterval");
if (stopTime < SIMTIME_ZERO || d < stopTime) {
selfMsg->setKind(GENERATE);
scheduleAt(d, selfMsg);
} else {
selfMsg->setKind(STOP);
scheduleAt(stopTime, selfMsg);
}
}
void UdpOwnApp::sendPacket() {
if (queue.isEmpty()) {
// no packets in queue
} else {
cObject * obj = queue.pop();
Packet * packet = dynamic_cast<Packet*>(obj);
if (packet) {
if (dontFragment)
packet->addTag<FragmentationReq>()->setDontFragment(true);
L3Address destAddr = chooseDestAddr();
emit(packetSentSignal, packet);
socket.sendTo(packet, destAddr, destPort);
numSent ;
}
}
}
Комментарии:
1. Спасибо Ежи, это устраняет ошибки, но когда я запускаю omnetpp.ini, пакеты не генерируются, и поэтому пакеты вообще не отправляются. Количество сгенерированных и отправленных пакетов равно 0. Не могли бы вы подсказать, почему?
2. Ежи, я протестировал это с существующими файлами ned и omnetpp.ini для sensornetwork. Просто добавлен параметр для генерации пакетов в файле «ini». Сработает ли это, если я укажу имя файла только потому, что я не могу создать post с такими длинными кодами, и эти коды уже есть в INET?
3. Если бы вы могли предложить мне здесь, это было бы лучше. Спасибо
4. Вам обязательно следует добавить новый вопрос с вашей проблемой. Причины: 1) Вы не написали, почему вы считаете, что количество сгенерированных пакетов равно 0 — предоставленный код не содержит никакой статистики для записи этого значения. 2) Вы не написали, когда и где вы вызываете
generatePacket()
иsendPacket()
. 3) Вы не написали, какие параметры вы добавили и какие значения вы установилиomnetpp.ini
. 4)INET
не содержит видGENERATE
— вы не объяснили значениеGENERATE
, а также как обрабатывается сообщение с таким видом. Без этой информации никто не сможет вам помочь.