• 大小: 4KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: 其他
  • 标签: socket  TCP  滑动窗口  

资源简介

理解数据链路层的滑动窗口协议,完整实现滑动窗口协议中的1bit滑动窗口协议,通过socket实现TCP连接来进行模拟

资源截图

代码片段和文件信息

#pragma comment(lib “ws2_32.lib“)
#include   
#include    
#include 

//////////////////////////////////////////////////////////////////////////
//接收帧
//////////////////////////////////////////////////////////////////////////
BOOL Receiveframe(int * frameExceptint * frameRecvint winRecvSizeSOCKET socket)
{
char recvBuffer[128];//接收数据 
int frameNum;//接收帧号

    //从发送端接收帧   
if(recv(socketrecvBuffersizeof(recvBuffer)0) == SOCKET_ERROR)
{
printf(“接收数据失败!\n“);
return FALSE;
}
frameNum = atoi(recvBuffer);
if (frameNum != *frameExcept)//接收帧和希望接收帧号不匹配
{
printf(“所要接收的帧和接收到的帧不匹配!,要接收的帧号是:%d接收到的帧号是:%d\n“*frameExceptframeNum);
return FALSE;
}
else//接收帧和希望接收帧号匹配
{
*frameRecv = frameNum;
printf(“已经成功地接收帧%d,接收端窗口大小是:%d\n“*frameRecvwinRecvSize);

return TRUE;
}

//////////////////////////////////////////////////////////////////////////
//发送ACK
//////////////////////////////////////////////////////////////////////////
BOOL SendACK(int * frameExceptint * frameRecvSOCKET socket)
{
//通过随机数随机产生正确ACK帧号、错误ACK帧号以及不发送ACK帧
char sendBuffer[128];//发送数据

int random = 0;//随机数012,0表示返回正确ACK 1表示返回错误ACK 2表示不返回ACK

random = rand()%3;
if (random == 0)//表示正确接收,并且正确回复ACK
{

if (_snprintf(sendBuffersizeof(sendBuffer)-1“%d“*frameRecv) < 0)
{
printf(“写数据出错!\n“);
return FALSE;
}
else
{
sendBuffer[sizeof(sendBuffer)-1] = ‘\0‘;
}
//发送正确的ACK
if(send(socketsendBuffersizeof(sendBuffer)0) == SOCKET_ERROR)
{
printf(“发送数据失败!\n“);
return FALSE;
}
else
{
*frameExcept ^= 1;//经过确认,准备接受下一帧
printf(“针对已经接收到的帧%d回复ACK,回复的ACK号是%d:\n\n“*frameRecv*frameRecv);
}

}
else if (random == 1)//表示正确接收,并且错误回复ACK
{

if (_snprintf(sendBuffersizeof(sendBuffer)-1“%d“(*frameRecv)^1) < 0)
{
printf(“写数据出错!\n“);
return FALSE;
}
else
{
sendBuffer[sizeof(sendBuffer)-1] = ‘\0‘;
}
//发送错误的ACK
if(send(socketsendBuffersizeof(sendBuffer)0) == SOCKET_ERROR)
{
printf(“发送数据失败!\n“);
return FALSE;
}
else
{
printf(“针对已经接收到的帧%d回复ACK,回复的ACK号是%d:\n\n“*frameRecv(*frameRecv)^1);
}
}
else//表示正确接收,并且不回复ACK
{
//不发送ACK
printf(“没有针对已经接收到的帧%d发送ACK\n\n“*frameRecv);
}

return TRUE;
}

//////////////////////////////////////////////////////////////////////////
//初始化发送端监听socket
//////////////////////////////////////////////////////////////////////////
BOOL InitSocketReceiver(SOCKET * socketRecv)
{
WORD wVersionRequested;
WSADATA wsaData;
SOCKADDR_IN addrSender; 
int length = sizeof(struct sockaddr);
//版本
wVersionRequested = MAKEWORD(11); 

//启动
if (WSAStartup( wVersionRequested &wsaData) != 0)
{
printf(“启动socket不成功!\n“);
return FALSE;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) 
{
printf(“版本错误!\n“);
WSACleanup( );
return FALSE; 
}
//创建socket
*socketRecv = socket(AF_I

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4774  2010-04-01 12:15  SlideWindowReceiver.c

     文件       4830  2010-04-05 00:59  SlideWindowSender.c

----------- ---------  ---------- -----  ----

                 9604                    2


评论

共有 条评论