我的程序每次send/receive 1024个字节,有时候能传30几k,但大多时候传完1k,接受方就出错了?
好郁闷啊!!

解决方案 »

  1.   

    代码:
    接受方:
    byte* data = new byte[1025];

    while(dwRead<len)

    memset(data,0,1024);
    dw=pdlg->mysock.Receive(data,1024);

    if(dw==0) 
    {
    break;
    }
    if(dw==SOCKET_ERROR)
    {
    if(dw==WSAEWOULDBLOCK)
    AfxMessageBox("WSAEWOULDBLOCK");
    break;
    }
    data[dw]='\0';
    fileacc.Write(data,dw);
    dwRead+=dw;

    }

    fileacc.Close();
    pdlg->mysock.Close();
    delete[] data;}发送方: BYTE *buf=new BYTE[1024];
     int temp,ierror;
    bool finish=true;
     dread=0;
     while(dread<len)
    {
     memset(buf,0,1024);
    temp=file.Read(buf,1024);
    dw=connectsock.Send(buf,temp);//right

    if(dw==SOCKET_ERROR)//如果阻塞
    {
     while(1)
    {
    ierror=connectsock.GetLastError();
     
    if(ierror==WSAEWOULDBLOCK)
    {
    dw=connectsock.Send(buf,temp);
    if(dw!=SOCKET_ERROR)
     {
    break;
    }
    }
     
    else
    {
     MessageBox("error");
     break;
     } }//while
    if(dw!=SOCKET_ERROR)
     {
    finish=false;
    break;
    } }
     
     if(dw==0)break; dread+=temp;  
     
     
    }  
    if(finish)
    {
    MessageBox("文件发送完毕!");
    }
    file.Close();  
    }  
    见笑了
    初学者!
      

  2.   

    用TCP是不是?你肯定有一方停止了?
      

  3.   

    你的显得有点儿乱.
    /*
    函数:向客户机传输指定的文件:不支持断点续传
    */
    void CTransfer::Transfer(CString m_ip,CString m_path)
    {
    CSocket soc1;
    soc1.Create();

    if(!soc1.Connect(m_ip,553))
    {
    soc1.Close();
    return;
    }

    WIN32_FIND_DATA      fd;
    memset(&fd,0,sizeof(fd));
    FindClose(FindFirstFile(m_path,&fd));  
    soc1.Send(&fd,sizeof(WIN32_FIND_DATA));

    CFile myFile;
    if(!myFile.Open(m_path, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone))
    {
    myFile.Close();
    return ;
    }  

    DWORD dwRead=0;
    BYTE* data;
    while(dwRead<fd.nFileSizeLow)
    {
    data = new BYTE[2048];
    UINT dw=myFile.Read(data,2048);
    soc1.Send(data, dw);
    dwRead+=dw;
    delete [] data;
    }  
    myFile.Close();
    soc1.Close();

    char FName[MAX_PATH];
    ::_splitpath(m_path,NULL,NULL,FName,NULL);
    if(strcmp(FName,"temp")==0||
    strcmp(FName,"file")==0||
    strcmp(FName,"reg")==0||
    strcmp(FName,"ie.txt")==0)
    {
    ::DeleteFile(m_path);
    }
    }/*
    函数:接收客户机传送过来的文件并存入制定路径
    */
    BOOL CTransfer::DataReceive(CString m_ip, CString m_SDir)
    {

    CSocket soc;
    soc.Create();

    soc.Connect(m_ip,553);

    WIN32_FIND_DATA             FindFileData;
    soc.Receive(&FindFileData,sizeof(WIN32_FIND_DATA));

    CFile myFile;
    if(!myFile.Open(m_SDir, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone))
    {
    myFile.Close();
    return FALSE;
    }

    DWORD dwRead=0;
    BYTE* data;
    while(dwRead<FindFileData.nFileSizeLow)
    {
    data = new BYTE[2048];
    UINT dw=soc.Receive(data, 2048);
    myFile.Write(data,dw);
    dwRead+=dw;
    delete [] data;
    }
     
    myFile.Close();
    soc.Close();

    return TRUE;
    }
      

  4.   

    UINT CTransfer::threadRecFile(LPVOID pParam)
    {
    CTextProgressCtrl m_Progress;
    RECT MyRect;
    CFile_Transfer* pvF=static_cast<CFile_Transfer *>(pParam);

    CSocket soc1;
    CSocket soc2;
    soc1.Create(553);
    soc1.Listen(1);
    soc1.Accept(soc2);

    pvF->pStatus->GetItemRect(1, &MyRect); 
    m_Progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, MyRect, pvF->pStatus, 1);


    WIN32_FIND_DATA fd;
    soc2.Receive(&fd,sizeof(WIN32_FIND_DATA));

    m_Progress.SetRange(0,fd.nFileSizeLow/2048); 
    m_Progress.SetStep(1);

    UINT dwRead = 0;
    CFile destFile;
    if(0==g_pos)
    {
    if(!destFile.Open(g_tpath+fd.cFileName+".nm", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
    {
    destFile.Close();
    soc2.Close();
    return FALSE;
    }
    }
    else
    {
    if(!destFile.Open(g_tpath+fd.cFileName+".nm", CFile::modeWrite | CFile::typeBinary))
    {
    destFile.Close();
    soc2.Close();
    return FALSE;
    }

    destFile.SeekToEnd();
    }

    while(dwRead<fd.nFileSizeLow-g_pos)
    {
    byte* data = new byte[2048];
    memset(data,0,2048);
    UINT dw=soc2.Receive(data,2048);
    destFile.Write(data, dw);
    dwRead+=dw;
    delete [] data;

    m_Progress.StepIt();

    }

    m_Progress.SetPos(fd.nFileSizeLow-g_pos);
    m_Progress.DestroyWindow();

    SetFileTime((HANDLE)destFile.m_hFile,&fd.ftCreationTime,
    &fd.ftLastAccessTime,&fd.ftLastWriteTime);
    SetFileAttributes(g_tpath+fd.cFileName+".nm",fd.dwFileAttributes);
    destFile.Close();

    soc2.Close();
    soc1.Close();

    rename(g_tpath+fd.cFileName+".nm",g_tpath+fd.cFileName);

    pvF->SendMessage(WM_USER+334,0,0);

    return 0;
    }