• 大小: 51.95MB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2023-07-19
  • 语言: C/C++
  • 标签: Socket  TCP  C语言  

资源简介

使用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\.NETframeworkVersion=v4.6.1.AssemblyAttributes.asm

     文件       4208  2018-05-19 19:47  TCP_Socket\Client\Client\Debug\.NETframeworkVersion=v4.6.1.AssemblyAttributes.obj

     文件        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\link.command.1.tlog

     文件       4156  2018-05-20 15:59  TCP_Socket\Client\Client\Debug\Client.tlog\link.read.1.tlog

     文件        496  2018-05-20 15:59  TCP_Socket\Client\Client\Debug\Client.tlog\link.write.1.tlog

     文件          2  2018-05-20 15:59  TCP_Socket\Client\Client\Debug\Client.tlog\metagen.read.1.tlog

     文件          2  2018-05-20 15:59  TCP_Socket\Client\Client\Debug\Client.tlog\metagen.write.1.tlog

     文件          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个文件信息

评论

共有 条评论