GOBACKN
GOBACKN
cc (Tic)
#include<stdio.h>
#include<string.h>
#include<omnetpp.h>
Define_Module(Tic);
Tic::Tic()
{
timeoutEvent = nullptr;
}
Tic::~Tic()
{
cancelAndDelete(timeoutEvent);
}
void Tic:: initialize() {
timeout = 5.0;
timeoutEvent = new cMessage("timeoutEvent");
generateMessage();
EV << "start timer\n";
scheduleAt(simTime()+timeout, timeoutEvent);
}
if(msg == timeoutEvent) {
if(counter) {
counter --;
EV << "Timeout expired re-sending message\n";
bubble("retransmission");
generateMessage(); // 重发所有未确认的数据包
scheduleAt(simTime()+timeout, timeoutEvent);
} else {
EV << "No response from toc Exiting the program\n";
}
} else {
receivedMessage(msg);
EV << "timer cancelled";
cancelEvent(timeoutEvent);
counter = 3;
generateMessage();
scheduleAt(simTime()+timeout, timeoutEvent);
}
}
void Tic::generateMessage()
{
char msgname[20];
if(!init_msg_flag) { // 发送初始消息获取窗口大小
init_msg_flag = 1;
strcpy(msgname, "init_packet");
cMessage *msg = new cMessage(msgname);
msg->addPar("seq_no");
msg->par("seq_no").setLongValue(seq_count);
sendMessage(msg);
} else { // 开始数据包传输
for(int i = 0; i < win_size; i++) {
cMessage *msg = new cMessage("Packet from tic");
seq_count = (seq_count + 1) % 256;
msg->addPar("seq_no");
msg->par("seq_no").setLongValue(seq_count);
sendMessage(msg);
unacknowledged_packets.push_back(seq_count);
// 删除已确认的包
unacknowledged_packets.erase(std::remove(unacknowledged_packets.b
egin(), unacknowledged_packets.end(), ack_no),
unacknowledged_packets.end());
seq_count = ack_no;
if (seq_count >= 255) {
seq_count = 0;
}
delete msg;
}
}
// Receiver.cc (Toc)
#include<stdio.h>
#include<string.h>
#include<omnetpp.h>
using namespace omnetpp;
Define_Module(Toc);
void Toc::initialize() {
loss_rate = exponential(0.1); // 使用指数分布生成丢包率
}
lost_pkt_flag = 1;
delete msg;
} else {
receivedMessage(msg);
generateMessage();
}
}
if(!init_msg_flag) { // 生成初始消息并发送窗口大小
strcpy(msgname, "Init_toc_msg");
init_msg_flag = 1;
GoBackN.ned
simple Tic
{
parameters:
@display("i=block/routing");
//volatile int data_rate @unit(Mbps);
gates:
input in;
output out;
}
simple Toc
{
parameters:
@display("i=block/routing");
int win_size;
int N;
gates:
input in;
output out;
}
network Tictoc
{
@display("bgb=298,347");
submodules:
tic: Tic {
@display("i=,cyan;p=75,72");
}
toc: Toc {
@display("i=,gold;p=208,185");
}
connections:
tic.out -->{ delay = 100ms; datarate = 100Mbps; }--> toc.in;
tic.in <-- { delay = 100ms; datarate = 100Mbps; }<-- toc.out;
}
GoBackN.ini
[General]
network = Tictoc
**.win_size = 4