-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSRRdtSender.h
More file actions
46 lines (37 loc) · 1.34 KB
/
Copy pathSRRdtSender.h
File metadata and controls
46 lines (37 loc) · 1.34 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
#ifndef SR_RDT_SENDER_H
#define SR_RDT_SENDER_H
#include "RdtSender.h"
using std::queue;
class SRPacket
{
public:
struct Packet realPacket;
bool ackStatus; //在发送方的窗口中用来记录该报文是否已经被接收,在接收方的窗口中用来记录该报文是否已经收到
SRPacket() {
ackStatus = false;
}
~SRPacket() {
}
/*起初没有定义析构方法,链接报错,实际上给个空的函数体就行,剩下的交给编译器*/
};
class SRRdtSender :public RdtSender
{
private:
int nextSequenceNumber; // 下一个发送序号
bool waitingState; // 是否处于等待Ack的状态
static int windowSize;
vector <SRPacket> packetWindow; //已发送并等待Ack的数据包vector,根据窗口大小,一共维护4个实例的vector数组
/*中间牵扯到随机访问修改ackbun等操作,因此不能使用难以随机访问的queue*/
int base; //记录发送窗口的当前序号
public:
bool getWaitingState();
bool send(const Message& message); //发送应用层下来的Message,由NetworkServiceSimulator调用,如果发送方成功地将Message发送到网络层,返回true;如果因为发送方处于等待正确确认状态而拒绝发送Message,则返回false
void receive(const Packet& ackPkt); //接受确认Ack,将被NetworkServiceSimulator调用
void timeoutHandler(int seqNum); //Timeout handler,将被NetworkServiceSimulator调用
void printSlideWindow();
bool inPacketWindow(int seqnum); //判断给定的seq序号对应的报文在不在发送队列中
public:
SRRdtSender();
virtual ~SRRdtSender();
};
#endif