在这里继续 希望上个帖子的好心人能够帮我解决问题

解决方案 »

  1.   

    通常做法是:分配一个缓冲区,例如你现在用的10KB的Buffer,先打开文件,取文件长度,将文件长度发给接收端,然后循环,循环中每次读文件,要读的数据长度给缓冲区的大小,读完之后根据返回的长度将实际读到的数据发给接收端,然后继续循环,直到全部读出并发送完为止,最后关闭文件。
    如果使用UDP协议需要对数据包进行编号,接收方收到后将数据包按照编号写入文件中响应位置,并将编号回发,发送端如果在一定时间内没有收到接收端的回应则自动重发该数据包。如果觉得这种方法麻烦,可以使用TCP协议。
      

  2.   

    我试试  我老大要我用UDP  感谢你的帮助
      

  3.   

    用UDP我所知道的也是这种方法,可以加入容错机制
      

  4.   

    UINT _stdcall ThreadSendFile(LPVOID)
    {
    CFile MyFileOpen;
        if(!MyFileOpen.Open(strPathNameOut,CFile::modeRead))
    {
         MessageBox(NULL,"Can't open the file",NULL,NULL);
    }
    char szBuffer[6124]={0};
    dw=0;
    //if(socketSendOut==INVALID_SOCKET)AfxMessageBox("文件发送句柄没有启动!");
    while(DWORD(dw)<MyFileOpen.GetLength())
    {  
             LONG nRead=MyFileOpen.Read(szBuffer,6124);
             if(::send(socketSendOut,szBuffer,nRead,0)==SOCKET_ERROR)AfxMessageBox("文件发送错误");  dw+=nRead;
     Sleep(3);
    }              
    AfxGetMainWnd( )->KillTimer(2);
    MyFileOpen.Close();
    CString sz; 
    AfxGetMainWnd( )->SetTimer(3,100,NULL);
    AfxGetMainWnd( )->GetDlgItem(IDC_TEXTDISPLAY)->GetWindowText(sz);
    sz=sz+"已经发送完毕!";
    AfxGetMainWnd( )->GetDlgItem(IDC_TEXTDISPLAY)->SetWindowText(sz);
    ::closesocket(socketSendOut);
    socketSendOut=INVALID_SOCKET;

        return 0;
    }
      

  5.   

    发送端:
    char buffer[4+10240];for (int i=0;;i++)
    {
    *(PDWORD)buffer = i;
    // read 10240 bytes to buffer+4
    // send 4+10240 bytes
    // ……
    }
    接收段:
    char buffer[4+10240];
    while (true)
    {
    // recv 4+10240 bytes to buffer
    int i = *(PDWORD)buffer;
    // move file pointer to i*10240 and write 10240 bytes from buffer+4
    // ……
    }
      

  6.   

    那个read那段是什么样的   我这边写的时候完全没用*(PDWORD) 所有有点不明白  那个read是不是 file.read(buffer+4,10240)  但是上面的
    *(pdword)=i  这是什么用的呢?
      

  7.   

    读文件就是file.read(buffer+4,10240)。
    *(PDWORD)=i是把编号写在数据包的最前面,与文件数据一起发送。
      

  8.   

    udt 适合你UDT协议-基于UDP的可靠数据传输协议
      

  9.   

    弄了好久 还是没弄好  还是感谢大家的帮忙 特别谢谢cnzdgs