本帖最后由 VisualEleven 于 2011-03-14 14:57:15 编辑

解决方案 »

  1.   

    不会是TCP粘包问题吧,调试一下看看确定是接收端还是发送端的问题先
      

  2.   

    Sbuf="01";
    Sbuf +=dlg->FindData.cFileName;
    int namelen=strlen(dlg->FindData.cFileName);
        
     int len=sizeof(SOCKADDR);        while(!(file.Open(strWildcard,CFile::modeRead|CFile::typeBinary)))
            {
            } 
            if((send(socket,Sbuf.GetBuffer(0),namelen+3,0))==SOCKET_ERROR)  //先发路径
            {
                AfxMessageBox("start error");
                Sbuf.ReleaseBuffer();
                return 1;
            }
            Sbuf.ReleaseBuffer();
      

  3.   

    又是文件传输. 
    http://download.csdn.net/source/719443
    我写的文件传输c/s. 
    socket select io模型传文件   
    使用socket select io模型传文件,3K一包.保证数据绝对唯一学习下吧
      

  4.   

    看你的代码就是出现粘包问题.
    你的客户机的代码在recv过后的处理有问题,不能直接判断
    if(recvbuf[0]=='0'&&recvbuf[1]=='1')这些东西
    因为TCP是基于字节流的协议,每次recv并不是整边界的,也就是说并不是每次recv返回的都正好是你send的整个缓冲内容
    我的建议是一次大于1024字节有利于提高网络吞吐量
      

  5.   

    你要判断finish=recv(dlg->m_socket,recvbuf,1202,0);
    返回的这个finish,如果是接收文件名包的话,这个finish大于你发的文件名长度,就有肯能吧数据包一起接收过来了。如果是接收文件数据包的话, 这个finish小于1202,那肯定是这个包分了多次接收,需要保存数据,并在下次接收包的时候组合一下。所以判断到头2个数据格式不对时,也可能是被截断的数据包。       if(recvbuf[0]=='0'&&recvbuf[1]=='1')
                {
                    filename+="\\";
                    filename+=&recvbuf[2];
                    file.Open((LPCTSTR)filename,CFile::modeCreate|CFile::modeWrite);
                }
                else if(recvbuf[0]=='1'&&recvbuf[1]=='1')
                {
                    file.Write(&recvbuf[2],finish-2);
                }
                else if(recvbuf[0]=='N'&&recvbuf[1]=='N'&&recvbuf[2]=='N'&&recvbuf[3]=='N'&&recvbuf[4]=='N')
                {
                    AfxMessageBox("文件接收完成");
                    file.Close();
                }
    else
      TRACE("收到截断的数据包!\r\n");看看有没有输出就知道了。个人意见,