⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testserverdlg.cpp

📁 同学的毕业设计。基于Hpc密码的选择重传协议的数据传输。希望能供大家参考。谢谢 !
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						frame_expected = 0 ;
						SetDlgItemText(IDC_EDIT_RECVMI,strRecvd);
						GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);  //禁用“发送消息”按钮
						GetDlgItem(IDC_EMSG)->EnableWindow(TRUE); 
					
					}
					else
					{
						m_ctrStatus.AddString(strStatusMsg+" 收到帧:"+strBuf);         //写日志
						m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);    
						strRecvd.Insert(num*16, cBuf);
						strRecvd.Insert((num+1)*16, '\0'); 
						frame_expected++;
						//SetDlgItemText(IDC_EDIT_RECVMI,strRecvd);
						//m_recvmi.SetWindowText(strRecvd);
					}
				}
			}
			break;
	case 2: 
			if(ack_expected == num)
			{
				if(count == num +1)
				{
					event = 0;Sleep(1);
					m_ctrStatus.AddString(strStatusMsg+" 收到最后一帧的返回帧:"+strBuf);         //写日志
					m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1); 
					KillTimer(ack_expected);
					ack_expected =0;
					next_frame_to_send = 0;
					nbuffered =0;
					GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);  //禁用“发送消息”按钮
					GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);   //禁用“发送消息”文本框
				}
				else
				{
					m_ctrStatus.AddString(strStatusMsg+" 收到返回帧:"+strBuf);         //写日志
					m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1); 
					ack_expected++;
					nbuffered--;					
					KillTimer(ack_expected-1);
				}
			}
		}
	
}
	}
UpdateData(FALSE);
return ;
}
	

void CTestServerDlg::OnDisConnect() //断开联接函数
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_sListenSocket.Close();
	m_sConnectSocket.Close();
	theTime = CTime::GetCurrentTime();
    strStatusMsg = theTime.Format("%H:%M:%S");   //记录事件发生的时间
    m_ctrStatus.AddString(strStatusMsg + " 已断开连接!");
	m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);   //垂直滚动到底部
    iConnStatus = 0;                             //更新系统状态标志
    GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);  //禁用“发送消息”,“启动服务端”按钮,启用"停止服务端"按钮
	GetDlgItem(IDC_Connect)->EnableWindow(TRUE);
    GetDlgItem(IDC_DisConnect)->EnableWindow(FALSE);
	UpdateData(FALSE);
}

void CTestServerDlg::OnBsend()  //发送消息函数
{
	// TODO: Add your control notification handler code here
	
	 //int iSent=0;
	 next_frame_to_send=0;
	nbuffered = 0;
	 event = 1;
	UpdateData(TRUE);
    theTime = CTime::GetCurrentTime();
    strStatusMsg = theTime.Format("%H:%M:%S");   //记录事件发生的时间

	if(m_strMsg !="" || iConnStatus == 3)
	{  if(iConnStatus <= 1)      //系统断连状态
	     {
	         m_ctrStatus.AddString(strStatusMsg+" 用户已中止发送");  //写日志
			 m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);        //垂直滚动到底部
		     strSendMsgBuffer = "";
	     }
	   else if(iConnStatus == 2) //系统就绪, 开始发送第一帧数据
	    { m_ctrStatus.AddString(strStatusMsg+" 系统进入发送状态!");        //写日志
		  GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);  //禁用“发送消息”按钮
	      GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);   //禁用“发送消息”文本框
          AfxBeginThread(Sender,this);
	   } 
		  
		  /*
		  iConnStatus = 4;                             //修改连接标志位:正在发送一条信息
		  strSendMsgBuffer.Format(_T("共%d帧-第%d帧-%s"), m_strMsg.GetLength()/16,iFramePos,m_strMsg.Mid(iFramePos*16,16)); //拼凑一帧信息:帧号*信息总长度*数据
		  iLen = strSendMsgBuffer.GetLength();
		  m_ctrStatus.AddString(strStatusMsg+" 系统进入发送状态!");        //写日志
          m_ctrStatus.AddString(strStatusMsg+" 发送帧:" + strSendMsgBuffer);  //写日志
		  m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);                 //垂直滚动到底部
		  iSent = m_sConnectSocket.Send(LPCTSTR(strSendMsgBuffer),iLen);       //发送帧
		  if (iSent == SOCKET_ERROR){SetTimer(1,2000, NULL);}              // 发送失败或超时
		  else {SetTimer(2,2000, NULL);}                                   // 看对应返回是否超时
	    }

	   else if(iConnStatus == 3) //数据发送中: 发送反馈帧
	    { 
		  iLen = strSendMsgBuffer.GetLength();
		  iSent = m_sConnectSocket.Send(LPCTSTR(strSendMsgBuffer),iLen);       //发送返回帧
		  if (iSent == SOCKET_ERROR){SetTimer(1,2000, NULL);}              // 发送失败或超时,此处发送成功即可,不需要对方再次回应
		}

	   else                      //数据发送中, 发下一帧
	    {
			iFramePos = iFramePos + 1;
			if(iFramePos >= m_strMsg.GetLength()/16)  //发送完成 
			{
				m_ctrStatus.AddString(strStatusMsg+" 信息发送完毕!");    //写日志
				m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);         //垂直滚动到底部
//				m_ctlChatMsg.AddString(strStatusMsg+" 发送内容:");       //写聊天记录
 //               m_ctlChatMsg.AddString("  "+m_strMsg);                   //写聊天记录
//				m_ctlChatMsg.SetCurSel(m_ctlChatMsg.GetCount()-1);       //垂直滚动到底部
                iConnStatus = 2;                                         //设置系统状态
//				m_strMsg = "";                                           //清空输入框
                strSendMsgBuffer = "";                                   //清空存储变量(发送缓冲区).
                GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);  //启用“发送消息”按钮
	            GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);   //启用“发送消息”文本框
			}
			else                                  //发下一帧
			{  strSendMsgBuffer = "";
			   strSendMsgBuffer.Format(_T("共%d帧-第%d帧-%s"), m_strMsg.GetLength()/16,iFramePos,m_strMsg.Mid(iFramePos*16,16)); //拼凑一帧信息:帧号*信息总长度*数据
               m_ctrStatus.AddString(strStatusMsg+" 发送帧:" + strSendMsgBuffer);  //写日志
			   m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);                     //垂直滚动到底部
               iLen = strSendMsgBuffer.GetLength();
		       iSent = m_sConnectSocket.Send(LPCTSTR(strSendMsgBuffer),iLen);
			   if (iSent == SOCKET_ERROR){SetTimer(1,2000, NULL);}               // 发送失败或超时
      		   else {SetTimer(2,2000, NULL);}                                    // 看对应返回是否超时
			}
	    }*/
	}
    UpdateData(FALSE);
	return;
}

void CTestServerDlg::OnResend()   //消息重发函数
{
	int iLen;
	int iSent=0;
    theTime = CTime::GetCurrentTime();
    strStatusMsg = theTime.Format("%H:%M:%S");   //记录事件发生的时间
    iReSend = iReSend + 1; //重发次数递增
    if(iReSend >= 5)       //重发超过5次的上限,停止发送,并恢复系统设置
	{ 
	  iReSend = 0;         //初始化重发计数器
      iConnStatus = 2;     //系统改为初始状态
      m_ctrStatus.AddString(strStatusMsg+" 重发过多,中止!");    //写日志
	  m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);          //垂直滚动到底部
      GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);                //启用“发送消息”按钮
	  GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);                 //启用“发送消息”文本框
	  UpdateData(FALSE);
      return;
	}
	else
	{
		m_ctrStatus.AddString(strStatusMsg+" 重发当前帧:"+strSendMsgBuffer);
		m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);                 //垂直滚动到底部
	    CString ReSendData;
		ReSendData.Format(_T("共%d帧-第%d帧-%d类帧-%s"), m_strMsg.GetLength()/16,next_frame_to_send,1,m_strMsg.Mid(next_frame_to_send*16,16)); //拼凑一帧信息:帧号*信息总长度*数据
		iLen = ReSendData.GetLength();
	    iSent = m_sConnectSocket.Send(LPCTSTR(strSendMsgBuffer),iLen);   //发送帧
	    if (iSent == SOCKET_ERROR){SetTimer(1001,2000, NULL);}              //发送失败或超时
	    else {SetTimer(1002,2000, NULL);}                                   //看对应返回是否超时
	}
}

void CTestServerDlg::OnTimer(UINT_PTR nIDEvent)    //定时器处理事件
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	KillTimer(nIDEvent); //关掉定时器
	theTime = CTime::GetCurrentTime();
    strStatusMsg = theTime.Format("%H:%M:%S");   //记录事件发生的时间
	if(nIDEvent<1000)
	{cMutex.Lock();
	next_frame_to_send = nIDEvent;
	nbuffered--;
	OnResend();
	cMutex.Unlock();
	}
	else{
	switch (nIDEvent)
	{
		case 1001:      //处理ID为1的定时器
			m_ctrStatus.AddString(strStatusMsg+" 发送失败!(超时或断开)");    //发送失败, 写日志
			m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);                 //垂直滚动到底部
			UpdateData(FALSE);
			//this->OnResend();                                                //重发
			break;
		case 1000:      //处理ID为0的定时器
			m_ctrStatus.AddString(strStatusMsg+" 端口不可用或被防火墙阻止"); //写日志
			m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);                 //垂直滚动到底部
			break;
		case 1002:
			m_ctrStatus.AddString(strStatusMsg+" 未收到返回帧!(超时)");      //写日志
			//this->OnResend();                                                //重发
			m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);                 //垂直滚动到底部
			break;
	}
	}
		//CDialog::OnTimer(nIDEvent);
}

void CTestServerDlg::OnClose()
{
  m_sConnectSocket.Close();
}

CString CTestServerDlg::GetErrorMsg()
{
	LPVOID lpMsgBuf;
	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(), 
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默认语言
		(LPTSTR)&lpMsgBuf, 0, NULL );
	//显示
	//MessageBox(0,(LPCTSTR)lpMsgBuf,_T("GetLastError"),MB_OK|MB_ICONINFORMATION );
	CString m_strError;
	m_strError.Format("错误代码:%d  \n出错信息:%s",GetLastError(), (LPCTSTR)lpMsgBuf);
	
	//释放内存
	::LocalFree( lpMsgBuf );
    return m_strError;
}

void CTestServerDlg::OnButtonOk() 
{
	CString strMsg,strData,strTemp,strTemp1;
	GetDlgItemText(IDC_EDIT_MSG,strMsg);
	SetDlgItemText(IDC_EDIT_MSG,"");
	strSendming=strMsg;
	if(strMsg.IsEmpty()==TRUE)
	{
	MessageBox("不能发送空消息");
	}
	else
	{
	GetDlgItemText(IDC_EDIT_SENDMING,strTemp);
//	SetDlgItemText(IDC_EDIT_SENDMING,strMsg);
	COleDateTime dtCurrent;
	dtCurrent = COleDateTime::GetCurrentTime();   
	strData = dtCurrent.Format("%H:%M:%S");
		
	strTemp1 +=  "你在" + strData;
	strTemp1 += "说:" + strMsg;
	strTemp1 += "\r\n\r\n";
	strTemp1 += strTemp;
	SetDlgItemText(IDC_EDIT_SENDMING,strTemp1);
	}	
}

void CTestServerDlg::OnButtonJiami() 
{
		CString strSendmi,strData;
		HPC Hpc1(miyao,key_len,spice);
		Hpc1.Jiami(strSendming,strSendmi);
		COleDateTime dtCurrent;
		dtCurrent = COleDateTime::GetCurrentTime();   
		strData = dtCurrent.Format("%H:%M:%S");
		m_ctrStatus.AddString(strData + " 加密成功.");
		m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);  
//		strSysmsg +=strData + ":" + "\r\n" + "加密成功!" + "\r\n";
		//SetDlgItemText(IDC_EDIT_SYSMSG,strSysmsg);
		SetDlgItemText(IDC_EDIT_SENDMI,strSendmi);	
}

void CTestServerDlg::OnButtonJiemi() 
{
	CString strRecvming,temp,strData,str,strRecvmi;
		COleDateTime dtCurrent;
		dtCurrent = COleDateTime::GetCurrentTime();   
		strData = dtCurrent.Format("%H:%M:%S");
	HPC Hpc1(miyao,key_len,spice);
	GetDlgItemText(IDC_EDIT_RECVMI,strRecvmi);
	Hpc1.jiemi(strRecvmi,strRecvming);
	str += strData+"收到:" + strRecvming;
	GetDlgItemText(IDC_EDIT_RECVMING,temp);
	str +="\r\n\r\n";
	str +=temp;
	SetDlgItemText(IDC_EDIT_RECVMING,str);
	m_ctrStatus.AddString(strData + " 解密成功.");
	m_ctrStatus.SetCurSel(m_ctrStatus.GetCount()-1);
}

void CTestServerDlg::OnButtonSetmiyao() 
{
	CString b ;
	GetDlgItemText(IDC_EDIT_MIYAO,b);
	int l = b.GetLength();
	if(l<16)
	{
		MessageBox("密钥过短,至少需要128位");
		
	}
	else{
	int i,j;

	unsigned long ch[33];
		memset(ch,0,132);
	
	for(i=0;i<l;i++)
	{
	ch[i]=b.GetAt(i);
	}
	memset(miyao,0,32);
	
	for(j=0;j<(l-1)/4+1;j++)
	{
		for(i=0;i<4;i++)
		{	
		miyao[j]=miyao[j]<<8;
		miyao[j]=ch[j*4+i]|miyao[j];
		
		}
	}
		key_len = l*8;
	}
	OnButtonSetmiyao2() ;
}

void CTestServerDlg::OnButtonSetmiyao2() 
{
	CString b ;
	GetDlgItemText(IDC_EDIT_MIYAO2,b);
	memset(spice,0,64);

	int l = b.GetLength();
	int i,j,k;
	unsigned long ch[65];
		memset(ch,0,260);
	for(i=0;i<l;i++)
	{
	ch[i]=b.GetAt(i);
	}
	for(k=0;k<8;k++)
	for(j=0;j<2;j++)
	{
		for(i=0;i<4;i++)
		{
		spice[k][j]=spice[k][j]<<8;
		spice[k][j]=ch[k*8+j*4+i]|spice[k][j];
		}
	}
	
}

void CTestServerDlg::OnButtonFile() 
{
	// TODO: Add your control notification handler code here
	CFILEencrypt dlg;
	dlg.DoModal();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -