资源简介
模仿数据链路层的gobackn协议
/*该协议是搭载ack的回退n步协议*/
#include
#include "protocol.h"
#define max_seq 7
#define flag 126
#define ESC 100
#define wait_time 2700 //发送计时器等待的时间
#define ack_wait_time 280
static int phl_ready = 0;
unsigned char buf[max_seq+1][270];
unsigned char ack[8]; //发送空的ack帧
unsigned char in_buf[600], last_buf[520];//接收时的缓冲区;去掉冗余之后的缓冲区,为防备因误码两帧合并为一帧而定义了很大一个数组
int nbuffered=0; //发送的帧数
int buf_size[max_seq+1]; //记下以发送各帧的帧长
int next_frame_to_send=0;
int frame_in_phl=0; //用于成帧
int frame_expected=0;
int ack_expected=0;
int between(int a,int b,int c)
{
if( ((a<=b)&&(b<c)) || ((c<a)&&(a<=b)) || ((b<c)&&(c<a)) )
return 1;
else return 0;
}
//判断帧尾,防止出现误判esc esc flag为数据的情况
int end_flag(int in_len)
{
int count=0;
int i;
if(in_len=0;i--)//记录flag前的esc数目
count++;
return count%2; //若flag前的esc为偶数,则为帧尾
}//成帧函数--数据帧
void send_frame(char *my_buf,int len)
{
int n;
buf[frame_in_phl][0]=(frame_expected+max_seq)%(max_seq+1); //ack
buf[frame_in_phl][1]=frame_in_phl; //发送帧的帧号
for(n=0;n<len;n++)
buf[frame_in_phl][n+2]=my_buf[n]; //将处理过的新帧赋值到缓冲区中
len=len+2;
*(unsigned int *)(buf[frame_in_phl]+len) = crc32(buf[frame_in_phl],len); //在原始帧的基础上加检验和
buf_size[frame_in_phl]=len+4; //记录当前帧的长度,包括3个帧头,4个检验和
nbuffered=nbuffered+1; //缓冲区占用数加一
frame_in_phl=(frame_in_phl+1)%(max_seq+1);
}
//成帧函数--ack帧
void send_ack() //ack帧的处理
{
ack[0]=(frame_expected+max_seq)%(max_seq+1);
ack[1]=max_seq+10; //ack帧的序号位,使ack[1]==frame_expected恒不成立
*(unsigned int *)(ack+2) = crc32(ack,2); //在原始帧的基础上加检验和
}
//主函数
int main(int argc, char **argv)
{
int event, arg, n , m , i , j , len = 0 ,in_len = 0;
unsigned char my_buf[260];
int phl_wait=0; //在物理层中还没有被发送的帧
protocol_init(argc, argv);
enable_network_layer();
for (;;) {
event = wait_for_event(&arg);
switch (event) {
case NETWORK_LAYER_READY:
代码片段和文件信息
/*该协议是搭载ack的回退n步协议*/
#include
#include “protocol.h“
#define max_seq 7
#define flag 126
#define ESC 100
#define wait_time 2700 //发送计时器等待的时间
#define ack_wait_time 280
static int phl_ready = 0;
unsigned char buf[max_seq+1][270];
unsigned char ack[8]; //发送空的ack帧
unsigned char in_buf[600] last_buf[520];//接收时的缓冲区;去掉冗余之后的缓冲区为防备因误码两帧合并为一帧而定义了很大一个数组
int nbuffered=0; //发送的帧数
int buf_size[max_seq+1]; //记下以发送各帧的帧长
int next_frame_to_send=0;
int frame_in_phl=0; //用于成帧
int frame_expected=0;
int ack_expected=0;
int between(int aint bint c)
{
if( ((a<=b)&&(b return 1;
else return 0;
}
//判断帧尾防止出现误判esc esc flag为数据的情况
int end_flag(int in_len)
{
int count=0;
int i;
if(in_len<=0)
return 1;
for(i=in_len-1;in_buf[i]==ESC&&i>=0;i--)//记录flag前的esc数目
count++;
return count%2; //若flag前的esc为偶数,则为帧尾
}//成帧函数--数据帧
void send_frame(char *my_bufint len)
{
int n;
buf[frame_in_phl][0]=(frame_expected+max_seq)%(max_seq+1); //ack
buf[frame_in_phl][1]=frame_in_phl; //发送帧的帧号
for(n=0;n buf[frame_in_phl][n+2]=my_buf[n]; //将处理过的新帧赋值到缓冲区中
len=len+2;
*(unsigned int *)(buf[frame_in_phl]+len) = crc32(buf[frame_in_phl]len); //在原始帧的基础上加检验和
buf_size[frame_in_phl]=len+4; //记录当前帧的长度包括3个帧头,4个检验和
nbuffered=nbuffered+1; //缓冲区占用数加一
frame_in_phl=(frame_in_phl+1)%(max_seq+1);
}
//成帧函数--ack帧
void send_ack() //ack帧的处理
{
ack[0]=(frame_expected+max_seq)%(max_seq+1);
ack[1]=max_seq+10; //ack帧的序号位,使ack[1]==frame_expected恒不成立
*(unsigned int *)(ack+2) = crc32(ack2); //在原始帧的基础上加检验和
}
//主函数
int main(int argc char **argv)
{
int event arg n m i j len = 0 in_len = 0;
unsigned char my_buf[260];
int phl_wait=0; //在物理层中还没有被发送的帧
protocol_init(argc argv);
enable_network_layer();
for (;;) {
event = wait_for_event(&arg);
switch (event) {
case NETWORK_layer_READY:
len = get_packet(my_buf);
phl_wait++;
send_frame(my_buflen);
stop_ack_timer();
if (phl_ready) {
for(j=0;j {
//帧结构为 ack seq 内容
//每帧尾部加发送一个flag
for (i = 0; i < buf_size[next_frame_to_send]; i++){
if ((buf[next_frame_to_send][i]==flag) || (buf[next_frame_to_send][i]==ESC) )
send_byte(ESC);
send_byte(buf[next_frame_to_send][i]);
}
send_byte(flag);//帧尾
start_timer(next_frame_to_sendwait_time); //发送完启动相应的定时器
next_frame_to_send=(next_frame_to_send+1)%(max_seq+1);
}
phl_ready = 0; //记录物理层当前状态为
phl_wait = phl_wait-j;
}
break;
case PHYSICAL_layer_READY:
if (phl_wait) { //若有未发送的帧便发送
for(j=0;j {
for (i = 0; i < buf_size[next_frame_to_send]; i++){
if ( (buf[next_fram
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3574 2007-10-24 14:11 gobackn\datali
文件 541 2007-10-24 12:53 gobackn\datali
文件 66560 2008-12-02 21:26 gobackn\datali
文件 1215 2008-09-27 22:58 gobackn\protocol.h
文件 252 2008-12-02 21:00 gobackn\datali
文件 74690 2008-09-27 22:51 gobackn\Debug\protocol.lib
文件 45624 2008-09-27 22:51 gobackn\Release\protocol.lib
文件 33792 2008-12-02 21:00 gobackn\Release\vc60.idb
文件 5242 2008-12-02 21:00 gobackn\Release\datali
文件 180508 2008-12-02 14:23 gobackn\Release\datali
文件 69632 2008-12-02 21:00 gobackn\Release\datali
文件 79872 2008-12-02 19:17 gobackn\性能测试记录表.doc
文件 50688 2008-12-02 19:28 gobackn\源程序清单-样板.DOC
文件 37888 2008-12-02 19:21 gobackn\实验报告评语.doc
文件 41994 2008-12-02 18:38 gobackn\测试数据\datali
文件 123963 2008-12-02 18:16 gobackn\测试数据\datali
文件 65335 2008-12-02 18:38 gobackn\测试数据\datali
文件 96352 2008-12-02 18:16 gobackn\测试数据\datali
文件 64971 2008-12-02 17:19 gobackn\测试数据\datali
文件 69573 2008-12-02 17:55 gobackn\测试数据\datali
文件 43509 2008-12-02 17:41 gobackn\测试数据\datali
文件 67138 2008-12-02 17:33 gobackn\测试数据\datali
文件 35678 2008-12-02 16:57 gobackn\测试数据\datali
文件 41921 2008-12-02 18:38 gobackn\测试数据\datali
文件 124850 2008-12-02 18:16 gobackn\测试数据\datali
文件 65543 2008-12-02 18:38 gobackn\测试数据\datali
文件 95321 2008-12-02 18:16 gobackn\测试数据\datali
文件 65507 2008-12-02 17:19 gobackn\测试数据\datali
文件 70150 2008-12-02 17:55 gobackn\测试数据\datali
文件 43448 2008-12-02 17:41 gobackn\测试数据\datali
............此处省略13个文件信息
- 上一篇:读取3ds文件模拟飞机飞行
- 下一篇:Gabor滤波器C++程序
相关资源
- OpenCv背景差分228299
- C++控制Windows桌面切换
- C语言windowlinux平台的SNTP实现
- mfc调用webservice的客户端
- libx264最新稳定版本附WINDOWS下编译步骤
- the C programming language ( kindle 版)
- 关于 tarjan 算法
- 计算机图形学 中点画椭圆法 Bresenha
-
单项锁相环 MATLAB Simuli
nk仿真 C语言 -
自抗扰控制器C语言实现Simuli
nk转化 - 编译C++需要的库文件win32 mak
- AES5种加密模式源码C语言
- 页面调度方法FIFONUROPT等
- C语言实现TFTP客户端代码
- yaolog v1.5(很有特色的C++跨平台日志库
- 计算机网络作业-winsock写的ping实现
- 基于Linux的VIM编辑器超炫配置
- 汉明码7,4
- 在VC 6.0的opencv环境下视频显示与捕捉
- Windows课程设计报告与源码
- mini2440开发板上的录音程序
- C++获取windows系统服务
- RPP算法-RobustPlanarPose-C++
- PnP solvers C++版本,包括P3Pf,Epnp等
- kalman和ukf滤波C语言源码和
- 深度学习DBN代码
- C++开源日志库Easylogging++ V9.80版本源码
- ArcGis Engine C++ 开发教程
- 定义一个Date 类,数据成员有year,m
- PNCC声特征matlab代码
评论
共有 条评论