我想写一个文件传输的类,多线程,支持断点续传。
我不知道该用CSocket 还是 CAyncSocket 还使用API?
还有就是对多用户的管理,没有一点概念,这两天都在考虑这个问题,很晕!
谢谢

解决方案 »

  1.   

    这里找不到你满意的答案吗?来这里试试!
    这里有问必答
    http://systemer.51.net/cgi-bin/leoboard.cgi
    希望你能在这里找到你满意的答案!
      

  2.   

    http://www.vckbase.com/document/viewdoc.asp?id=448
    这篇文章不错,还有源代码
      

  3.   

    看过了,也研究过了,先在用SOCKET API,我可以实现
    可是我现在要用MFC来开发,所以就不知道如果管理多个用户了
    我也研究过NDK,可是觉得它的代码太麻烦了
      

  4.   

    BOOL SendFile(SOCKET s, CString fname)
    {
    CFile f;
    BOOL p=f.Open(fname,CFile::modeRead);
    char buff[1024];
    int y;
    int x;
    if(!p)
    return false;
    while(true)
    {
    y=f.Read(buff,1024);
    x=send(s,buff,y,0);
    if(y<1024)
    {
    f.Close();
    break;
    }
    } return true;
    }www.codeproject.com/
      

  5.   

    不久前写的,你看看是不是你要的!!!
    /*===============================文件传输======================================================
        功能:把指定的文件传输到指定IP地址的计算机。
    参数:strIP : 目的计算机的IP地址。
          uPort : 端口号。
      chSrc : 文件路径及名称。
      bSend : 文件不存在时是否建立一个新文件。
        返回值:
    =============================================================================================*/
    BOOL CopyFileClient(CString strIP, UINT uPort, char *chSrc, BOOL bSend)
    {
    BOOL bRet = FALSE;
    CSocket sckClient;
    CFile file;
    do
    {
    if(bSend)
    {
    bRet = file.Open(chSrc, CFile::modeRead);
    }
    else
    {
    bRet = file.Open(chSrc, CFile::modeCreate | CFile::modeWrite);
    }
    if(!bRet)
    {
    break ;
    }
    bRet = sckClient.Create();
    if(!bRet)
    {
    break ;
    }
    bRet = sckClient.Connect(strIP, uPort);
    if(!bRet)
    {
    break ;
    }
    BYTE *chFileData = new BYTE[ 1024 + 1 ];
    char chData[10];
    int nSize = 0;
    if(bSend)
    {
    nSize = file.GetLength();
    int nRead = nSize;
    ZeroMemory(chData, 10);
    memcpy(chData, &nSize, sizeof(int));
    int nRet = sckClient.Send(chData, sizeof(int));
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    while(nRead > 0)
    {
    int n1 = min(nRead, 1024);
    int n2 = file.Read(chFileData, n1);
    nRead -= n2;
    nRet = sckClient.Send(chFileData, n2);
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }

    bRet = TRUE;
    }
    }
    else
    {
    char chData[10];
    ZeroMemory(chData, 10);
    nSize = 0;
    int nRet = sckClient.Receive(chData, 10);//读文件大小
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    nSize = *((int*)(chData));
    if(nSize <= 0)
    {
    bRet = FALSE;
    break ;
    }
    BYTE *chFileData = new BYTE[1024+1];
    int nWrite = 0;
    while(nWrite < nSize)
    {
    nRet = sckClient.Receive(chFileData, 1024);
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    file.Write(chFileData, nRet);
    nWrite += nRet;
    bRet = TRUE;
    }
    }
    delete []chFileData;
    if(!bRet) // 送文件数据出错.
    {
    break ;
    }
    }while(0);
    if(sckClient.m_hSocket != INVALID_SOCKET)
    {
    sckClient.Close();
    }
    if(file.m_hFile != CFile::hFileNull)
    {
    file.Close();
    } return bRet;
    }
    /*===============================文件接收======================================================
        功能:把接收的数据保存到指定的文件中。
    参数:uPort : 端口号。
      chSrc : 文件路径及名称。
      bSend : 文件不存在时是否建立一个新文件。
        返回值:
    =============================================================================================*/BOOL CopyFileServer(UINT uPort, char *chDes, BOOL bSend)
    {
    BOOL bRet = FALSE;
    CFile file;
    CSocket sckServer;
    CSocket sckClient;
    do
    {
    if(!bSend)
    {
    bRet = file.Open(chDes, CFile::modeCreate | CFile::modeWrite);
    }
    else
    {
    bRet = file.Open(chDes, CFile::modeRead);
    }
    if(!bRet)
    {
    break ;
    }
    bRet = sckServer.Create(uPort);
    if(!bRet)
    {
    break ;
    }
    bRet = sckServer.Listen();
    if(!bRet)
    {
    break ;
    }
    bRet = sckServer.Accept(sckClient);
    if(!bRet)
    {
    break ;
    }
    char chData[10];
    BYTE *chFileData = new BYTE[1024+1];
    int nSize = 0;
    if(!bSend)
    {
    ZeroMemory(chData, 10);
    int nRet = sckClient.Receive(chData, 10);//读文件大小
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    nSize = *((int*)(chData));
    if(nSize <= 0)
    {
    bRet = FALSE;
    break ;
    }
    int nWrite = 0;
    while(nWrite < nSize)
    {
    nRet = sckClient.Receive(chFileData, 1024);
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    file.Write(chFileData, nRet);
    nWrite += nRet;

    bRet = TRUE;
    }
    }
    else
    {
    nSize = file.GetLength();
    int nRead = nSize;
    ZeroMemory(chData, 10);
    memcpy(chData, &nSize, sizeof(int));
    int nRet = sckClient.Send(chData, sizeof(int));
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    while(nRead > 0)
    {
    int n1 = min(nRead, 1024);
    int n2 = file.Read(chFileData, n1);
    nRead -= n2;
    nRet = sckClient.Send(chFileData, n2);
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }

    bRet = TRUE;
    }
    }
    delete []chFileData;
    }while(0);
    if(sckClient.m_hSocket != INVALID_SOCKET)
    {
    sckClient.Close();
    }
    if(sckServer.m_hSocket != INVALID_SOCKET)
    {
    sckServer.Close();
    }
    if(file.m_hFile != CFile::hFileNull)
    {
    file.Close();
    } return bRet;
    }