windows-滑动窗口协议模拟代码求补全!!!!!

问题描述

滑动窗口协议模拟代码求补全!!!!!

//发送方sender.cpp文件
#include
#include
#include"sender.h"
#include
#include
#include
#include
#define SLEEPMS 1000
#define MAXPOOL 8
#define RECEIVE_MAX_LENGTH 8
#define MAX_LENGTH 8
#define SEND_MAX_LENGTH 8
CRITICAL_SECTION gCS;

void InitLine(LinkQueue *q) //初始化队列
{
q->front = q->rear = NULL;
}
int QueueEmpty(LinkQueue *q)//判断队列是否为空
{
return q->front == NULL && q->rear == NULL;
}
frame QueueFront(LinkQueue *q)
{
if (QueueEmpty(q))
{
printf("队列为空!n");
Sleep(SLEEPMS);
exit(0);
}
return q->front->head_data;
}
int QueueLen(LinkQueue *q)//计算队列长度
{
if (QueueEmpty(q))
{
return 0;
}
int num = 0;
Framenode *p = q->front;
while(p != NULL)
{
num++;
p = p->next;
}
return num;
}

void GetFrameFromHost(LinkQueue *q) //数据帧发送完毕(收到确认帧)后,删除发送的数据帧(队头)
{
if(QueueLen(q) >= MAXPOOL)
{
printf("data %d 已准备好n", q->front->head_data.head.seq);
return;
}
Framenode *p=(Framenode *)malloc(sizeof(Framenode));
memset(p->head_data.head.data, 0, MAX_LENGTH);
srand((unsigned)time(NULL));
p->head_data.size = rand() % MAX_LENGTH; // 帧大小随机生成
memset(p->head_data.head.data, '1', p->head_data.size);
p->head_data.head.ack = -1;
p->head_data.head.kind = data;
p->head_data.head.seq = 0;
p->next =NULL;
if(QueueEmpty(q))
q->front = q->rear=p; // 首帧是待发送的帧
else
{
p->head_data.head.seq = (q->rear->head_data.head.seq + 1)%MAXPOOL;
q->rear->next =p;
q->rear =p;
}
printf("从主机得到:data %d,放入缓存n", p->head_data.head.seq);
GetFrameFromHost(q); // 由于实验需要,假设主机有足够多的数据帧要发送
}
void DeLine(LinkQueue *q) //将帧数据保存供提交主机,curw是打开的待接收数据的窗口
{
Framenode *p = NULL;
if(QueueEmpty(q))
{
printf("队列为空!n");
}
else
{
p = q->front;
q->front = p->next;
if (q->rear == p) q->rear = NULL;
printf("发送data %d, %d 成功!从缓存中删除n", p->head_data.head.seq, p->head_data.size);
free(p);
p = NULL;
}
}

void main()//发送方主函数
{
printf("建立连接 ... n");
Begin:
WORD wVersionRequested;
WSADATA wsaData; //初始化socket库
wVersionRequested=MAKEWORD(1,1); //两个byte型合并成一个WORD型
int err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
Sleep(SLEEPMS);
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup(); //中止Windows Sockets服务 WSAStartup()成对使用
Sleep(SLEEPMS);
return;
}
socketClient = socket(AF_INET,SOCK_STREAM,0);//监听的套接字
SOCKADDR_IN clientadd;
clientadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
clientadd.sin_family = AF_INET;
clientadd.sin_port = htons(7001);//设置连接端的IP、端口
if(SOCKET_ERROR==connect(socketClient,(SOCKADDR*)&clientadd,sizeof(SOCKADDR)) ) //连接
{
WSACleanup();
Sleep(SLEEPMS);
goto Begin;
}
char getData[RECEIVE_MAX_LENGTH];
memset(getData, 0, RECEIVE_MAX_LENGTH); //清零
if(recv(socketClient,getData,RECEIVE_MAX_LENGTH,0) == SOCKET_ERROR) //接受
{
printf("接受连接提示信息出错!n");
}
else
{
printf("%sn",getData);

}
char sendData[SEND_MAX_LENGTH];
memset(sendData, 0, SEND_MAX_LENGTH);
strcpy(sendData, "你好接收方,我是发送方!");
if( SOCKET_ERROR == send(socketClient,sendData,strlen(sendData)+1,0) ) //发送
{
printf("发送连接提示信息出错!n");
WSACleanup();
closesocket(socketClient);
Sleep(SLEEPMS);
return;
}
printf("按任意键继续!n");
while (!kbhit()) {}; //等待开始
Sleep(SLEEPMS);
printf("1bit滑动窗口协议:发送方,发送窗口=1n");
LinkQueue QueueQ;
InitLine(&QueueQ);
frame packetsend; //data
frame packetreceive; // ack,nak
unsigned long tick = GetTickCount();
int ret = 0;
HANDLE hThread;
while(1)
{
GetFrameFromHost(&QueueQ); //从主机取数据帧
memset(&packetsend, 0, sizeof(packetsend));
Sleep(SLEEPMS);
printf("n");
packetsend = QueueFront(&QueueQ); //取数据帧
ret = send(socketClient, (char *)&packetsend, sizeof(packetsend), 0);//发送data
if(ret == SOCKET_ERROR)
{
printf("发送数据出错!n");
continue;
}
printf("发送数据帧:data %d, %dn", packetsend.head.seq, packetsend.size);
const unsigned long timeOut = 5 * 1000; //设置超时计时器 5秒超时
memset(&packetreceive, 0, sizeof(packetreceive));
Sleep(SLEEPMS);
printf("n");

HANDLE hThrea;
InitializeCriticalSection(&gCS); // 初始化临界区

hThread=CreateThread(NULL, 0, ReceiveFun, (LPVOID)&packetreceive, 0, NULL);

int r = WaitForMultipleObjects(1, &hThread, TRUE, timeOut);

DeleteCriticalSection(&gCS); //与InitializeCriticalSection(&gCS);成对使用

if(ret == SOCKET_ERROR || ret == SOCKET_DISCONN)
{
printf("接受出错!Press any key to continuen");
while (!kbhit()) {};
continue;
}
if(r == WSA_WAIT_TIMEOUT) //判断超时
{
TerminateThread(hThread, 0); //终止线程
printf("超时重传:data %d, %dn", packetsend.head.seq,packetsend.size);
}
else if(packetsend.head.seq == packetreceive.head.ack)
{
srand((unsigned)time(NULL));
switch(rand() % 5) //假定产生随机结果,20%的概率超时
{
case 0:
printf("接收方发送回复超时(ack丢失模拟):%dn", packetsend.head.seq);
printf("超时重传:data %d, %dn", packetsend.head.seq,packetsend.size);
break;
default:
if(packetreceive.head.kind == ack)
{
printf("接受ack帧:ack %dn", packetreceive.head.ack);
DeLine(&QueueQ);
}
else if(packetreceive.head.kind == nak)
{
printf("接受nak帧:nak %dn", packetsend.head.seq);
}
break;
}
}
else printf("帧序号出错: %dn", packetreceive.head.ack);
if(GetTickCount() - tick > 20 * TIMEOUT) //设置时间20秒
{
printf("持续时间20s. 按q退出,其他键继续n");
int kbc = getchar();
if(kbc == 'q' || kbc == 'Q')
break;
}
}
printf("按任意键退出!n");
while (!kbhit()) {};
Sleep(SLEEPMS);
printf("谢谢使用!n");
WSACleanup();
closesocket(socketClient);
Sleep(SLEEPMS);
}
DWORD WINAPI ReceiveFun(LPVOID pArg)
{
EnterCriticalSection(&gCS);//进入critical section
frame *packetreceive = (frame *)pArg;
ret = recv(socketClient, (char *)packetreceive, sizeof(*packetreceive), 0);
LeaveCriticalSection(&gCS); //线程用毕,离开critical section
return ret;
}
//头文件sender.h部分
#include

typedef enum {data = 1,ack,nak,tout} frame_kind; //帧类型
typedef struct frame_head
{
frame_kind kind; //帧类型
unsigned int seq; //序列号
unsigned int ack; //确认号
unsigned char data[MAX_LENGTH]; //数据
}Head;
typedef struct frame
{
frame_head head; //帧头
unsigned int size; //数据的大小
} Frame;
typedef struct framenode //队列节点类型
{
frame head_data;
struct framenode *next;
} Framenode;
typedef struct

{
Framenode *front; //队头指针
Framenode *rear; //队尾指针
} LinkQueue;

解决方案

现在缺什么代码呢?

时间: 2025-01-01 07:14:10

windows-滑动窗口协议模拟代码求补全!!!!!的相关文章

框架-滑动窗口协议模拟用vc++/mfc做的,其中代码缺少.rc文件不能在vc++6.0上运行!!怎么补

问题描述 滑动窗口协议模拟用vc++/mfc做的,其中代码缺少.rc文件不能在vc++6.0上运行!!怎么补 求教!! // Sender.cpp : Defines the class behaviors for the application. #include "stdafx.h" #include "Sender.h" #include "SenderDlg.h" #ifdef DEBUG #define new DEBUG_NEW #u

c++ 滑动窗口-求教一段滑动窗口协议模拟中的代码的含义

问题描述 求教一段滑动窗口协议模拟中的代码的含义 void CSenderDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default //启动网络层数据发送定时器 switch(nIDEvent) { case ID_SEND_TIMER: if (m_iBuffered < m_SendWndSize) PostMessage(NETWORK_LAYTER_READY

线程-滑动窗口协议的模拟求一份能符合运行的c++代码

问题描述 滑动窗口协议的模拟求一份能符合运行的c++代码 要求: 1. Windows 环境下运行,程序应在1-2台PC上运行: 2. 演示在两台计算机间传输文件.允许在同一台机器中用两个独立线程来模拟 3. 功能: 1) 由一台PC(线程)向另一台PC(线程)发送数据包,界面应显示出双方帧个数变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态显示数据帧的发送情况和接受情况,包括在相应窗口详细显示相应的ACK和其他收发数据帧后发出的消息,以表明模拟协议的正确运作过程. 2) 接收方及

socket-请教一点关于计算机网络中的滑动窗口协议的问题

问题描述 请教一点关于计算机网络中的滑动窗口协议的问题 在下最近在完成计算机网络的课程设计,题目要用socket实现滑动窗口协议,但是有点要求看不懂,百度也找不到,想请教一下:超时计数器技术,帧编号盘重技术,校验和技术, 使用**重传技术**是否意味着是**选择重传ARQ**? 请各位指导 解决方案 用google,而不是那些山寨业余的搜索引擎. 解决方案二: 题主应该是大二或者大三的学生吧. 我之前选修<TCP/IP>的时候也学了滑动窗口协议. 你问的这个问题涉及的点比较多,如果你理论部分都

linux下让irb实现代码自动补全的功能

    我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:require 'irb/completion' ,但是我们不可能每次都手动敲着一行代码,KISS和DRY哪去了?     简单的一劳永逸的方法是在~/.irbrc里添加irb运行时需要执行的代码即可.你要问我怎么知道.irbrc文件路径的,你可以通过IRB.rc_file看到.网上还有更高级的自动补全

前端开发工具-visual studio code中html文档中输入script代码自动补全问题

问题描述 visual studio code中html文档中输入script代码自动补全问题 请问各位大神,怎么配置visual studio code(vsd)才能在html文档中插入script脚步有 自动补全的功能!!!开发工具-visual studio code中html文档中输入script代码自动补全问题-visual studio 补全"> 但是,如何在html中的script标签内实现补全 解决方案 visual studio 代码自动补全 与快捷键如何在Visual

PHPStorm添加第三方库的代码自动补全

1.下载swoole-ide-helper-en Java代码   git clone https://github.com/eaglewu/swoole-ide-helper.git    在你项目的External Libraries上右键->Configure PHP Include Path然后选择那个文件夹(swoole-ide-helper-en)就可以了 添加完成后看效果   为什么我添加了却没有提示? 解决办法:将自应用里面的相关文件统统"Mark as Plain Tex

Eclipse的代码自动补全功能

Windows-->Preferences-->Java–>Editor–>Content Asist 在Auto activation triggers for Java后面的文本框里只有一个".". 现在你将其改为".abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"即可. 然后你再试试,会发现,现在的补全功能跟VS差不多了.你还可以在Advanced和Favorite里进行高级的设

artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载_jquery

artDialog是一个轻巧且高度兼容的javascript对话框组件,可让你的网页交互拥有桌面软件般的用户体验. artDialog的特殊UI框架能够适应内容变化,甚至连外部程序动态插入的内容它仍然能自适应,因此你不必去考虑消息内容尺寸使用它.它的消息容器甚至能够根据宽度让文本居中或居左对齐--这一切全是XHTML+CSS原生实现. 为了方便使用,特别制作出artDialog Dreamweaver代码提示的插件. 代码提示效果如下: 使用方法: 把artDialog.xml文件复制到 如:A