资源简介
理解数据链路层的滑动窗口协议,完整实现滑动窗口协议中的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
相关资源
- Omron ETN21模块进行modbustcp通讯
- 通信软件的具体实例──基于Socket的
- 用Socket编程实现FTP
- websocket实现一对一聊天
- 组态王中S7-300TCP驱动
- 基于Apache Mina实现的TCP长连接和短连接
- CVI下的TCP服务器和客户端
- 代码客:G-TcpServer(IOCP) 1.0 正式版及
- TCP 发包工具(windows)
- SOCKET 网络编程 计算机网络 作业 客户
- linux 网络实验 ftp程序
- 用Socket写的简易FTP服务器和客户端
- VxWorks TCPIP协议栈
- socket小工具(可方便建立TCP UDP的soc
- socket客户端源码
- vc 编写的基于TCP协议的客户/服务器
- 基于CSocket的多人聊天室
- 采用WINSOCK2 编写的TCP/UDP通信程序
- socket文件传输源码
- Modbus TCP Client
- 易语言 TCP使用HTTP、SOCKES5代理IP。
- 西门子S7-1200 MODBUS-TCP通讯编程
- 200SMART Modbus-TCP通信程序演示-轮询(多
- Socket自制系统
- HP用SOCKET实现(客户端---服务端)
- TCP_UDP对结构体加密数据传输
- 基于PIC的TCP/IP网络协议和zigbee无线传
- 欧姆龙PLC tcp通信工具
- 欧姆龙以太网通讯TCP/UDP及欧姆龙PLC程
- zeromq的windows版本安装包
评论
共有 条评论