📄 protocol.h
字号:
// protocol.h: interface for the Cprotocol class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_PROTOCOL_H__C45915CE_6FBA_4EDA_9847_92239569DCC0__INCLUDED_)
#define AFX_PROTOCOL_H__C45915CE_6FBA_4EDA_9847_92239569DCC0__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <winsock.h>
//定义更新状态变量的宏
#define inc(k) if (k<MAX_SEQ) k=k+1;else k=0
#define MAX_PKT 1500 //包的最大字节数
#define MAX_SEQ 7
typedef unsigned int seq_nr;//序号和确认号
//包的定义
typedef struct{
char data[MAX_PKT];
}packet;
typedef enum{data,ack,nak} frame_kind;//定义帧的类型
//定义事件的类型
typedef enum{frame_arrival,can_write} event_type;
//帧的结构
typedef struct{
frame_kind kind; //帧的类型
seq_nr seq; //序号
seq_nr ack; //确认数
packet info; //网络层数据
int checksum; //校验域
}frame;
typedef struct{
bool isack;
frame sendframe;
int time;
}Sendbuffer;
typedef struct{
bool ischeck;//收到的确认,但还没有检查
frame recvframe;
}Recvbuffer;
///
typedef struct{
Recvbuffer *recvbuffer;
int rfront;
int rrear;
int rtemp;
}RecvQueue;
typedef struct {
Sendbuffer *sendbuffer;//初始化的动态分配存储空间
int sfront; //头指针,若队列不空,指向队列头元素
int srear; //尾指针,若队列不空,指向队列尾元素的下一个位置
int stemp;
}SendQueue;
class Cprotocol
{
public:
Cprotocol();
virtual ~Cprotocol();
public:
//求校验和
int checksum_mat(int framekind,int frameseq,packet p);
//检查效验和,返回检查的结果
bool examine_checksum(frame f);
//从网络层取一个数据帧
void from_network_layer(packet *p);
CString check_network_layer();
//从物理层取到一个帧
int from_physical_layer(SOCKET sock,frame &r);
//发送一个数据帧
void send_frame(SOCKET sock,frame s,int wp,int lp);
//将数据发送到网络层
CString to_network_layer(packet p);
//将数据发往物理层准备传送
void to_physical_layer(SOCKET sock,frame &s,int wp,int lp);
//等待一个事件发生,返回事件类型
void wait_for_event(SOCKET sock,event_type &event);
};
#endif // !defined(AFX_PROTOCOL_H__C45915CE_6FBA_4EDA_9847_92239569DCC0__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -