none
[MFC]中Socket通信确保数据传输的完整 RRS feed

  • 问题

  • MFC编程中的Socket通信
    我想知道如何确保发送端发送的数据被接受端完整的接受
    然后接收端返回接受的信息,如果接收端没有完整接受数据那么等待重发。
    
    
    	while(!m_exit)                       //开始为真
    	{
    		
    		//接受外部请求
    		if(!aSocket.Accept(serverSocket))
    		{
    			continue;
    		}
    		else
    		{
    			TCHAR szRecvMsg[1024] = {0};
    //			byte szRecvMsg[1024] = {0};
    			TCHAR szOutMsg[1024] = {0};	
    			TCHAR TEMP[1024] = {0};
    			CString str;
    
    //			byte[] message=new byte[1024]; 
    //			byte message[1024] = {0};
    
    			unsigned char p[129]; //接受缓冲区
    			ZeroMemory(p,sizeof(p)); //接收缓冲区清零
    			serverSocket.Receive(p,128); //接收128个字节
    			int widecharlen=MultiByteToWideChar( //计算从Ansi转换到Unicode后需要的字节数
    				CP_ACP,
    				MB_COMPOSITE,
    				(char*)p, //要转换的Ansi字符串
    				-1, //自动计算长度
    				0,
    				0
    				);
    			CString tmpstr;
    			tmpstr.GetBuffer(widecharlen); //为转换后保存Unicode字符串分配内存
    			MultiByteToWideChar( //从Ansi转换到Unicode字符
    				CP_ACP,
    				MB_COMPOSITE,
    				(char*)p,
    				-1,
    				tmpstr.GetBuffer(widecharlen), //转换到tmpstr
    				widecharlen //最多转换widecharlen个Unicode字符
    				);
    //			m_clientdlg->m_listbox.InsertString(0,tmpstr); //插入到listbox中显示
    //			CCeSocket::OnReceive(nErrorCode);
    
    
    			//接受客户内容
    //			serverSocket.Receive((void*)szRecvMsg, 1024, 0);
    
    			wsprintf(szOutMsg, _T("Receive Msg: %s \r\n"), tmpstr);
    
    //			str.Format(message);
    //			wsprintf(message, _T("Receive Msg: %s \r\n"), szRecvMsg);
    //			wcscpy(TEMP, szOutMsg);
    
    			
    			aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
    //			str.Format(_T("%s"), szOutMsg);
    			strText += szOutMsg;
    
    //			strText += message;
    			
    			aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
    
    			//发送内容给客户端
    			serverSocket.Send("Have Receive The Msg" + strText, 1024, 0);
    
    			//关闭
    			serverSocket.Close();
    		}
    		
    	}
    2010年3月31日 1:53

答案

  • 对消息求MD5。之后把MD5也作为消息传给客户端,客户端根据内容同样求MD5进行比较,如果与服务器端传来的相同则没有丢失,返回消息给服务器端。当然如果你要担心安全问题,就用密文加盐传送。
    麻烦把正确答案设为解答。
    • 已标记为答案 jkhuang23 2010年4月2日 6:19
    2010年3月31日 8:30
    版主