局域网 或本机检测上传文件 MD5 值一致    外网就不一致了   TCP传输的啊   不会丢包啊     有过类似情况的支支招急等

解决方案 »

  1.   

    cfile.Open(strDat,CFile::modeWrite|CFile::typeBinary|CFile::modeCreate,NULL);             //zhuyi
     if (nSize<nRecvOneTime)//排除第一次接收到小于最小包的情况
     {  nRecv=recv(socket,pFileData,nSize,0);
     file.Write(pFileData,nSize);
     /*nnTotalRecv=nTotalRecv;
     nnSize=nSize;*/
     } 
     else
     {  while (true)
     {  if(nRecv+nTotalRecv<=nSize) 
     {
     nRecv=recv(socket,pFileData,nRecvOneTime,0);
     file.Write(pFileData,nRecv);
     nTotalRecv+=nRecv;
     }
     else
     {
     nRecv=recv(socket,pFileData,nSize-nTotalRecv,0);
     file.Write(pFileData,nSize-nTotalRecv);
     nTotalRecv+=nRecv;  }
     i=nTotalRecv;
     j=nSize;
     cfile.Seek(0,CFile::begin);
     int dd=nTotalRecv+nSeek;
     cfile.Write(&dd,sizeof(int));
     if(nTotalRecv==nSize)
     {
     break;
     }
     }
     }  delete []pFileData;
     file.Close();
     cfile.Close();
     if (DeleteFile(strDat)!=0)
     {
     AfxMessageBox(_T("文件下载完成!"));
     }
     return 0;
     }
      

  2.   

    发送结束后,不从容关闭的话,外网网络环境不是很好,直接closesocket可能导致最后一点点数据被丢弃,导致文件不一致,建议发送结束后,先shutdown从容关闭,然后再closesocket释放连接
      

  3.   

    我以前做个一个程序,局域网没问题但外网有问题
    原因好像是网络数据包最大只能存储10个,超过10个就会丢包
    比如说服务器是A,客户端是B
    局域网:A处代码1ms发送一个包,B处代码 1ms处理一个包,很稳定,不会丢包
    外网:A处代码执行时间1ms 发送1个包,但因为阻塞,10ms后b处还未接到数据,那么A处继续发包就会丢失
    解决办法,B收到包后通知A,A继续发