• 大小: 1.4M
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-09-02
  • 语言: 其他
  • 标签: 其他  

资源简介

滑动窗口协议.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

评论

共有 条评论