-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStopWaitRdtSender.cpp
More file actions
72 lines (55 loc) · 2.57 KB
/
Copy pathStopWaitRdtSender.cpp
File metadata and controls
72 lines (55 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "stdafx.h"
#ifndef NONE_STOP_WAIT_RDT_SENDER_MODE
#include "Global.h"
#include "StopWaitRdtSender.h"
StopWaitRdtSender::StopWaitRdtSender():expectSequenceNumberSend(0),waitingState(false)
{
}
StopWaitRdtSender::~StopWaitRdtSender()
{
}
bool StopWaitRdtSender::getWaitingState() {
return waitingState;
}
bool StopWaitRdtSender::send(const Message &message) {
if (this->waitingState) { //发送方处于等待确认状态
return false;
}
this->packetWaitingAck.acknum = -1; //忽略该字段
this->packetWaitingAck.seqnum = this->expectSequenceNumberSend;
this->packetWaitingAck.checksum = 0;
memcpy(this->packetWaitingAck.payload, message.data, sizeof(message.data));
this->packetWaitingAck.checksum = pUtils->calculateCheckSum(this->packetWaitingAck);
pUtils->printPacket("发送方发送报文", this->packetWaitingAck);
pns->startTimer(SENDER, Configuration::TIME_OUT,this->packetWaitingAck.seqnum); //启动发送方定时器
pns->sendToNetworkLayer(RECEIVER, this->packetWaitingAck); //调用模拟网络环境的sendToNetworkLayer,通过网络层发送到对方
this->waitingState = true; //进入等待状态
return true;
}
void StopWaitRdtSender::receive(const Packet &ackPkt) {
if (this->waitingState == true) {//如果发送方处于等待ack的状态,作如下处理;否则什么都不做
//检查校验和是否正确
int checkSum = pUtils->calculateCheckSum(ackPkt);
//如果校验和正确,并且确认序号=发送方已发送并等待确认的数据包序号
if (checkSum == ackPkt.checksum && ackPkt.acknum == this->packetWaitingAck.seqnum) {
this->expectSequenceNumberSend = 1 - this->expectSequenceNumberSend; //下一个发送序号在0-1之间切换
this->waitingState = false;
pUtils->printPacket("发送方正确收到确认", ackPkt);
pns->stopTimer(SENDER, this->packetWaitingAck.seqnum); //关闭定时器
}
else {
pUtils->printPacket("发送方没有正确收到确认,重发上次发送的报文", this->packetWaitingAck);
pns->stopTimer(SENDER, this->packetWaitingAck.seqnum); //首先关闭定时器
pns->startTimer(SENDER, Configuration::TIME_OUT, this->packetWaitingAck.seqnum); //重新启动发送方定时器
pns->sendToNetworkLayer(RECEIVER, this->packetWaitingAck); //重新发送数据包
}
}
}
void StopWaitRdtSender::timeoutHandler(int seqNum) {
//唯一一个定时器,无需考虑seqNum
pUtils->printPacket("发送方定时器时间到,重发上次发送的报文", this->packetWaitingAck);
pns->stopTimer(SENDER,seqNum); //首先关闭定时器
pns->startTimer(SENDER, Configuration::TIME_OUT,seqNum); //重新启动发送方定时器
pns->sendToNetworkLayer(RECEIVER, this->packetWaitingAck); //重新发送数据包
}
#endif