资源简介
滑动窗口协议.zip

代码片段和文件信息
#include“socket_udp.h“
#define HLEN 3//帧头部长度
#define DLEN 8//帧数据长度
#define ALEN 3//ACK帧长度
#define SWP_SEND_TIMEOUT 500//定义超时长度为500ms
#define link “127.0.0.1“//定义要发送的对象
#define FLAG_ACK_VALID ‘a‘//定义ACK帧
#define FLAG_DATA_VALID ‘d‘//定义数据帧
#define SUCCESS 1;//定义已经成功收到的消息
static void sendSWP(SwpState *stateMsg *frame);//发送函数
static int deliverSWP(SwpState *stateMsg *frame);//接收并返回ACK函数
//发送
static void semWait(Semaphore *sendWindowNotFull);//信号量处理(-1)
static void store_swp_hdr(SwpHdr hdrchar *hbuf);//存储发送的帧头部
static void msgAddHdr(Msg *framechar *hbuf);//将头部添加到帧上
static void msgSaveCopy(char *msgMsg *frame);//将消息添加到帧上
static Event evSchedule(Msg *frameint time);//调用定时器函数
DWORD WINAPI swpTimeout(LPVOID threadtype);//创建定时器线程
static void send_socket(char *addrMsg *frameint size);//UDP发送
static void mlisten();//监听数据
static void msend();//发送数据
//接收
static char *msgStripHdr(Msg *frameint length);//获取帧的头部
static void load_swp_hdr(SwpHdr *hdrchar *hbuf);//帧头部提取字符串
static bool swpInWindow(SwpSeqno AckNumSwpSeqno LARSwpSeqno LFS);//判断收到的帧是否在窗口内
static void evCancel(Event *);//取消超时定时器
static void msgDestroy(Msg *msg);//释放msg空间
static void semSignal(Semaphore *sendWindowNotFull);//信号量处理(+1)
static void prepare_ack(Msg *msgSwpSeqno n);//组成ACK消息
//全局变量
HANDLE hlisten;
HANDLE hsend;
SwpState *send_state;
Msg *frame;
HANDLE Mutex = CreateMutex(NULLFALSENULL);
void main(){
//模拟滑动窗口接收和发送过程
//初始化SwpStateMsg数据帧组帧
//启动两个线程,模拟收发
//监听终止
frame=(Msg *)malloc(11*sizeof(Msg));
//初始化消息
//frame=“message“;//8个字节的数据
//初始化状态
send_state=(SwpState *)malloc(sizeof(SwpState));
send_state->LAR=‘0‘;
send_state->LFS=‘0‘;
send_state->NFE=‘0‘;
send_state->sendWindowNotFull=CreateSemaphore(NULLSWSSWSNULL);
if(send_state->sendWindowNotFull==NULL){
printf(“CreateSemaphore error\n“GetLastError());
exit(0);
}
send_state->hdr.SeqNum=‘0‘;//3个字节头部
send_state->hdr.AckNum=‘0‘;
send_state->hdr.Flags=‘d‘;
for(int i=0;i send_state->sendQ[i].msg=(Msg *)malloc(8*sizeof(Msg));
send_state->sendQ[i].msg=“message“;
send_state->sendQ[i].timeout=NULL;
}
for(i=0;i send_state->recvQ[i].msg=(Msg *)malloc(8*sizeof(Msg));
send_state->recvQ[i].msg=“message“;
send_state->recvQ[i].recevied=NULL;
}
//初始化UDP函数
WSADATA wsaData;
if (WSAStartup(MAKEWORD(21)&wsaData)){
printf(“Winsock initializing fail\n“);
WSACleanup();
return;
}
//建立监听线程
hlisten=CreateThread(NULL0(LPTHREAD_START_ROUTINE) mlistenNULLCREATE_SUSPENDEDNULL);
ResumeThread(hlisten);
if(hlisten==NULL){
printf(“thread_listen create fail\n“);
}
hsend=CreateThread(NULL0(LPTHREAD_START_ROUTINE) msendNULLCREATE_SUSPENDEDNULL);
ResumeThread(hsend);
if(hsend==NULL){
printf(“thread_send create fail\n“);
}
Sleep(10000);
WSACleanup();
}
static void msend(){
printf(“thread_send started\n“);
while(1){
sendSWP(send_stateframe);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-10-31 19:00 Debug\
文件 32204 2018-10-31 19:00 Debug\socket_udp.obj
文件 148480 2018-10-31 19:00 Debug\vc60.idb
文件 77824 2018-10-31 19:00 Debug\vc60.pdb
文件 176171 2018-10-31 19:00 Debug\xieyi.exe
文件 207796 2018-10-31 19:00 Debug\xieyi.ilk
文件 3596772 2018-10-31 18:05 Debug\xieyi.pch
文件 459776 2018-10-31 19:00 Debug\xieyi.pdb
文件 9025 2018-10-31 18:59 socket_udp.cpp
文件 1065 2018-10-31 18:05 socket_udp.h
文件 4342 2018-10-31 19:17 xieyi.dsp
文件 516 2018-10-31 18:04 xieyi.dsw
文件 33792 2018-10-31 19:17 xieyi.ncb
文件 48640 2018-10-31 19:17 xieyi.opt
文件 1360 2018-10-31 19:00 xieyi.plg
相关资源
- vspd7.2.308.zip
- 价值2k的H漫画小说系统
- Pythonamp;课堂amp;笔记(高淇amp;400;集第
- ddos压力测试工具99657
- UML建模大全
- 开源1A锂电池充电板TP4056原理图+PCB
- m1卡 ic卡可选择扇区初始化加密软件
- TSCC.exe
- FTP课程设计(服务端+客户端)
- 计算机图形学 边填充算法实现代码
- 电力系统潮流计算程序集合
- oracle数据迁移项目实施方案
- Web Api 通过文件流 文件到本地
- Visio图标-最新最全的网络通信图标库
- Spire API文档
- OpenGL参考手册
- Python中Numpy库最新教程
- SPD博士V5.3.exe
- 直流无刷电机方波驱动 stm32 例程代码
- layui后台管理模板
- 仿知乎界面小程序源代码
- 云平台-阿里云详细介绍
- photoshop经典1000例
- scratch垃圾分类源码(最终版本).sb
- IAR ARM 7.8破解
- TI CCS V5.4 安装步骤及破解文件
- 松下plc FP-XH的驱动
- 局域网硬件信息收集工具
- 加快Windows XP操作系统开机速度
- 联想启天M4350 BIOS升级文件
评论
共有 条评论