资源简介
理解数据链路层的滑动窗口协议,完整实现滑动窗口协议中的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
- 上一篇:国内银行及核心系统厂商列表
- 下一篇:网龙同理心测试-20min
相关资源
- Socket 进程通信(类似QQ的聊天程序)
- uIP STM32 TCP Echo
- winsocket函数大全-中文
- 向指定ip端口发送数据并等待接收
- socket编程 TCP文件的传输实现 客户端和
- ModbusTCP_Slave程序
- 基于TCP文件传输控制台程序.zip
- TcpFileTransferDemo.rar
- tcp工具-hunt 1.5
- .net websocket 消息推送
- STM32F107实现DP83848-UDP-TCP通信程序
- 基于TCP的cs聊天程序.rar
- QT Qudpsocket 传送结构体数据
-
Socket xm
l 测试 - 基于delphi TCPclient与TCPserver的聊天程序
- tcptrace TCP端口监听工具 TCP跟踪
- UDP可靠传输(VTCP11.0)
- Socket通信.zip
- TCP/UDP Socket调试工具
- Qt QLocalServer QLocalSocket进程通信
- websocket.zip
- ios-Socket通信.zip
- 陕西电子科技大学精品课程TCPIP协议原
- USR-TCP232-Test.zip
- TCP/IP调试助手
- 基于TCP传输文件及文件夹的LabVIEW程序
- sockets5 代理服务器教程
- ModbusTCP测试程序源码
- 武汉理工大学TCPIP及网络编程复习重点
- rtp/rtcp协议实现源码
评论
共有 条评论