same

解决方案 »

  1.   

    接受
    UINT MyRecvFileThread(LPVOID pParam)
    {
    CSocket_sdk_sDlg *pDlg=(CSocket_sdk_sDlg *)pParam;
    CTime tm=CTime::GetCurrentTime();
    CString strtime;
    CString strfilename;
    strtime.Format("%d%d%d%d%d%d",tm.GetYear(),tm.GetMonth(),tm.GetDay(),tm.GetHour(),tm.GetMinute(),tm.GetSecond()); CFileDialog dlg(false); //另存文件
    int ret=recv(pDlg->sclientRev,(char*)&pDlg->m_finfo,sizeof(pDlg->m_finfo),0);
    if (ret==SOCKET_ERROR)
    return 0;
    strfilename=pDlg->m_finfo.strfilename;
    int nfileLength=pDlg->m_finfo.nfilelength;
    char fileme[500]={0};//必须足够大小
    CString szRevFilename=strtime+strfilename;
    strcpy(fileme,szRevFilename);
    dlg.m_ofn.lpstrFile=fileme; //文件名称 if(dlg.DoModal()==IDOK)
    pDlg->m_szFilepath=dlg.GetPathName(); //得到文件名名称、路径
    int n=0;
    char buf[1024]={0};
    CFile f(pDlg->m_szFilepath,CFile::modeCreate|CFile::modeWrite); //存文件
    for(;;)
    {
    n=recv(pDlg->sclientRev,buf,1024,0); //接受
    if(n==SOCKET_ERROR)
    {
    AfxMessageBox("error");
    break;
    }
    if(n==0) //0表示结束
    break; //接受完毕
    f.Write(buf,n);
    }
    f.Close();
    return 0;
    }
    /////发送
    UINT MySendFileThread(LPVOID pParam)
    {
    CProxyDemoDlg *pDlg=(CProxyDemoDlg *)pParam;
    char m_buf[1024]={0};
    int num=0;
    CFile myFile;
    if(!myFile.Open(pDlg->m_szFilepath, CFile::modeRead |CFile::typeBinary))
    return -1;
    pDlg->m_finfo.nfilelength=myFile.GetLength(); //得到文件大小
    strcpy(pDlg->m_finfo.strfilename,myFile.GetFileName());//得到文件名称
    int ret=send(pDlg->sclient,(char*)&pDlg->m_finfo,sizeof(pDlg->m_finfo),0);//发送文件信息
    if (ret==SOCKET_ERROR)
    {
    AfxMessageBox("Send() Error!");
    return 0;
    }
    myFile.Seek(0,CFile::begin);
    for(;;)
    {
    num=myFile.Read(m_buf,1024);
    if(num<=0) break;
    send(pDlg->sclient,m_buf,num,0); 
    }
    myFile.Close();
    return 0;
    }
      

  2.   

    比如说,100k的文件,传输了100k,但是接受只接收了30k,
      

  3.   

    不可能啥!tcp是可靠的.你把你发送和接收的字节打出来
      

  4.   

    接收方rev在接受一定的字节会出现接收失败
      

  5.   

    你在发送线程的
    ..
    send(pDlg->sclient,m_buf,num,0); 
    后加:Sleep(200);试试
      

  6.   

    你的这段代码好像是myqq里面的
      

  7.   

    判断发送端Send的返回值,如果是-1的话说明发送有问题了,主要原因是你发送端的发送缓存没有空间了,如果发生这样的情况,那么你刚才发送的东西需要重新发送,否则实际上在网络上发送的只是你的一部分,在接收端当然收不全了.
      

  8.   

    if(n==0) //0表示结束
    break;你这个判断有问题. 最好的传文件办法是应该在传文件之前将文件大小等信息传过来,然后接收端根据已接收的文件大小来判断是否接收完毕,最好发送端发送完成后,还发一个BYEBYE的标志,
      

  9.   

    发送方发送过快的问题 其实 也就是粘包问题 因为TCP是流协议 消息是没界限的 不要想当然的认为先发送文件属性 再发送文件内容  接收方也是先接收的是文件属性 后是文件内容
    或许接收文件属性时也接收了一部分文件内容试试 tyong(坏男孩) 或者 flashboy(爱写程序的小绵羊) 的办法
      

  10.   

    fengge8ylf:
    TCP没这个问题吧??