资源简介
使用VS中的VC++下面的CLR编写,主要目的用Socket模拟TCP通信协议,实验内容如下:i. 实现滑动窗口协议,窗口大小为5
ii. 模拟采用三次握手机制,显示出ACK、ack、Seq等标识位和参数
iii. 必须采用应答机制、超时计数器技术、帧编号判重技术、重传技术
iv. 校验和技术
a) 校验和s的计算:设要发送n字节,bi为第i个字,s=(b0+b1+…+bn) mod 256
v. 在接收端,设置随机数,根据随机数执行相关操作,0代表正常,1代表帧丢失,2代表帧出错,3代表应答帧丢失(即不发生应答帧)
vi. 必须使用图形界面,
a) 按批次(发送端一次发送的报文)显示相关内容
b) 发送端:显示发送的数据、是否重传、本次帧序号、接收到的应答帧的序号
c) 接收端:显示接收到的数据、本次帧序号、本次随机选择的出错情况、发送应答帧的序号、是否重复
要先打开Server端启动监听,再打开Client端进行连接,三次握手之后开始通信。
代码片段和文件信息
#include “ClientForm.h“
#include
#include
#include
using namespace Client;
time_t Start;//时间开始
time_t End;//时间结束
[STAThreadAttribute]
int main(array^args)
{
Application::EnableVisualstyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew ClientForm());
return 0;
}
void ClientForm::acceptMessage() {
isStillReceive = true;
isStillSend = true;
array^bytes = gcnew array(256);
try
{
//建立远端Endpoint
Int32 port = 13500;
// Int32 port = Convert::ToInt32(tbPort->Text->Trim());
// IPAddress^ipAddress = IPAddress::Parse(tbIP->Text->Trim());
IPAddress^ipAddress = IPAddress::Parse(“127.0.0.1“);
IPEndPoint^remoteEP = gcnew IPEndPoint(ipAddress port);
//建立socket对象
socketAtClient = gcnew Socket(AddressFamily::InterNetwork SocketType::Stream ProtocolType::Tcp);
//将socket连接至远端服务器
socketAtClient->Connect(remoteEP);
if (socketAtClient->Connected) {
// isConnectionOK = true;
tbSocketConn->Text = L“连接服务器成功!“;
}
tbMSGHistory->AppendText(“第一次握手:SYN = 1 Seq = 4000 ack = 0\r\n“);
Thread::Sleep(1000);
tbMSGHistory->AppendText(“第二次握手:SYN = 1 Seq = 4500 ack = 4001 ACK = 1\r\n“);
Thread::Sleep(1000);
tbMSGHistory->AppendText(“第三次握手:SYN = Seq = 4001 ack = 4501\r\n“);
tbMSGHistory->AppendText(“完成三次握手\r\n“);
tbMSGHistory->AppendText(“\r\n“);
}
catch (Exception^)
{
MessageBox::Show(“Exception accrued during connect server!“ “Exception“);
}
}
void ClientForm::SendMessage() {
try
{
while (isStillSend)//开始循环发送数据
{
SendMSG[2] = 0;//FIN = 0
SendMSG[0] = Seqnum;
Start = clock();
socketAtClient->Send(SendMSG);//发送数据
datanum = Seqnum % 10;
Data[0] = datanum;
tbSendData->AppendText(““+ datanum);//显示本次发送的数据
tbSendNum->AppendText(““+Seqnum);//显示本次发送的帧序号
if (flagError == 0)//是否重传
{
tbError->AppendText(“否“);
}
else if (flagError == 1) {
tbError->AppendText(“是“);
flagError = 0;
}
tbMSGHistory->AppendText(“Send: 帧序号“ + Seqnum + “ 数据: “ + datanum+“\r\n“);//在消息历史中显示本次发送的内容
Seqnum++;
Thread::Sleep(1000);
tbSendData->Clear();//清空本次消息内容
tbSendNum->Clear();//清空本次序号内容
tbError->Clear();//清空本次是否重传内容
}
}
catch (Exception^)
{
MessageBox::Show(“Exception accrued during Client“ “Exception“);
}
}
void ClientForm::ReceiveMessage() {
try
{
while (isStillReceive)
{
if (socketAtClient->Available > 0)
{
int byteCount = socketAtClient->Receive(ACKMSG);//开始接收数据
End = clock();
if (Seqnum - ACKMSG[0] == 5)//保证滑动窗口为5
{
Seqnum--;
Thread::Sleep(5000);
}
if (byteCount > 0) {
if (ACKMSG[1] == 1 || ACKMSG[1] == 3 || difftime(EndStart) > 1000)//有出错的情况,需要重传,只要帧不正常或者超时
{
Seqnum--;
flagError = 1;
}
else if(ACKMSG[1] == 0)
{
tbRecvNum->AppendText(““+AC
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
..A..H. 34304 2018-05-22 22:16 TCP_Socket\Client\.vs\Client\v15\.suo
文件 57237504 2018-05-22 22:16 TCP_Socket\Client\.vs\Client\v15\Browse.VC.db
文件 11075584 2018-05-15 17:19 TCP_Socket\Client\.vs\Client\v15\ipch\AutoPCH\54b0956dc61d3843\MYFORM.ipch
文件 76546048 2018-05-22 21:53 TCP_Socket\Client\.vs\Client\v15\ipch\AutoPCH\c358c61f70b1cb8e\CLIENTFORM.ipch
文件 6934 2018-05-15 17:33 TCP_Socket\Client\Client\Client.vcxproj
文件 1078 2018-05-15 17:20 TCP_Socket\Client\Client\Client.vcxproj.filters
文件 165 2018-05-15 17:17 TCP_Socket\Client\Client\Client.vcxproj.user
文件 3575 2018-05-20 15:59 TCP_Socket\Client\Client\ClientForm.cpp
文件 13827 2018-05-20 15:59 TCP_Socket\Client\Client\ClientForm.h
文件 5817 2018-05-20 14:44 TCP_Socket\Client\Client\ClientForm.resx
文件 229 2018-05-19 19:47 TCP_Socket\Client\Client\Debug\.NETfr
文件 4208 2018-05-19 19:47 TCP_Socket\Client\Client\Debug\.NETfr
文件 180 2018-05-20 14:44 TCP_Socket\Client\Client\Debug\Client.ClientForm.resources
文件 88 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.log
文件 3294 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\CL.command.1.tlog
文件 43694 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\CL.read.1.tlog
文件 996 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\CL.write.1.tlog
文件 205 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\Client.lastbuildstate
文件 20834 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\Client.write.1u.tlog
文件 1210 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\li
文件 4156 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\li
文件 496 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\li
文件 2 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\me
文件 2 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\Client.tlog\me
文件 0 2018-05-15 17:20 TCP_Socket\Client\Client\Debug\Client.tlog\TZRES.DLL.bi
文件 944 2018-05-20 14:44 TCP_Socket\Client\Client\Debug\Client.vcxproj.GenerateResource.cache
文件 6366 2018-05-15 17:21 TCP_Socket\Client\Client\Debug\Client.vcxprojAssemblyReference.cache
文件 513190 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\ClientForm.obj
文件 454656 2018-05-20 15:59 TCP_Socket\Client\Client\Debug\vc141.pdb
文件 1432 2018-05-15 17:17 TCP_Socket\Client\Client.sln
............此处省略66个文件信息
相关资源
- 基于STM32F407的W5500 tcpserver(官网例程
- 基于CS的TCP文件传输程序设计
- socket客户端.c
- socket服务端.c
- TCP/IP客户端和服务器端源代码,好用
- modbus tcp/ip 简单通讯
- libnet发送udp和tcp包
- socket tcp应用
- TCP/IP与串口调试
- Tcp自定义命令调试工具
- Qt TCP聊天室demo
- 西北大学2015年计算机网络复试真题回
- TCP服务端和TCP客户端通讯
- socket通讯c++源码(客户端+服务端)
- MFC的异步网络通讯应用程序
- 各种关于CAsyncSocketCSocket内幕及其用法
- MFC多人聊天室
- 使用socket套接字发送udp数据包
- CAsyncSocket异步实现服务器与客户端
- 基于TCP协议的C/S传输文件C++)
- 基于socket文件传输的实现源码[C++]
- 计算机网络课设-邮件客户端实现(含
- C语言实现TCP/IP协议通信和UDP协议通信
- c语言+UDP+DES加密+socket编程
- 局域网下,手机可以和电脑通过sock
- 计算机网络课程设计之Ping程序含C++原
- 基于c++和winsocket的局域网聊天源代码
- 基于udp的socket编程
- MFC下TCP服务器
- VC++,CSocket实现网络聊天,可发文件,
评论
共有 条评论