// 传送文件
bool SendFile(SOCKET sClient)
{
if (NULL == g_pBuff)
{
   ReadFile(sClient);
}
int nPacketBufferSize = MAX_PACKET_SIZE - 2 * sizeof(int); // 每个数据包存放文件的buffer大小
// 如果文件的长度大于每个数据包所能传送的buffer长度那么就分块传送
for (int i = 0; i < g_lLength; i += nPacketBufferSize)
{  
   CCSDef::TMSG_FILE tMsgFile;
   tMsgFile.tFile.nStart = i;
   if (i + nPacketBufferSize + 1> g_lLength)
   {
    tMsgFile.tFile.nSize = g_lLength - i;
   }
   else
   {
    tMsgFile.tFile.nSize = nPacketBufferSize;
   }
   //printf("start = %d, size = %d\n", tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);
   memcpy(tMsgFile.tFile.szBuff, g_pBuff + tMsgFile.tFile.nStart, tMsgFile.tFile.nSize);
   char* pTemp = new char[sizeof(CCSDef::TMSG_FILE)];
   memcpy(pTemp,&tMsgFile,sizeof(CCSDef::TMSG_FILE));
   ::send(sClient, pTemp, sizeof(CCSDef::TMSG_FILE), 0);
   Sleep(0.5);
}
delete [] g_pBuff;
g_pBuff = NULL;
return true;
}// 写入文件
bool WriteToFile(CCSDef::TMSG_HEADER *pMsgHeader)
{
assert(NULL != pMsgHeader);
CCSDef::TMSG_FILE* pMsgFile = (CCSDef::TMSG_FILE*)pMsgHeader;
int nStart = pMsgFile->tFile.nStart;
int nSize = pMsgFile->tFile.nSize;
memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize);
if (0 == nStart)
{
   printf("Saving file into buffer...\n");
}
memcpy(g_pBuff + nStart, pMsgFile->tFile.szBuff, nSize);
//printf("start = %d, size = %d\n", nStart, nSize);// 如果已经保存到缓冲区完毕就写入文件
if (nStart + nSize >= g_lLength)
{
   printf("Writing to disk....\n");
   // 写入文件
   FILE* pFile;
   pFile = fopen(g_szFileName, "w+b");
   fwrite(g_pBuff, sizeof(char), g_lLength, pFile);
   delete [] g_pBuff;
   g_pBuff = NULL;
   fclose(pFile);
   // 保存文件成功传送消息给server退出server
   CCSDef::TMSG_SENDFILESUCCESS tMsgSendFileSuccess;
   while (SOCKET_ERROR == ::send(g_sClient, (char*)(&tMsgSendFileSuccess), sizeof(CCSDef::TMSG_SENDFILESUCCESS), 0))
   {
   }
   printf("Save the file %s success!\n", g_szFileName);
   return true;
}
else
{
   return false;
}
}
以上代码是socket传文件的,包含分块传送文件,但是我测试过了,只能传10M以内的文件,也就是说分块传没启作用。
如何才能传送大文件?????

解决方案 »

  1.   

    好像有一个ReadHugeFile API,一般read不能支持大文件的读取
      

  2.   

    http://download.csdn.net/source/1777622
      

  3.   

    http://d.download.csdn.net/down/888667/wenxy1
      

  4.   

    大文件肯定一边读一边传啦int readlen = 0;
    while((readlen=file.Read(10240, buff) > 0)
        send(buff, readlen);
      

  5.   

    bool MyReadFile( char* Filename )
    {
    bool is_read;
    char fullPath[512];
    unsigned int size_t;
    int fp = 0; //文件句柄
    fp = _open( Filename, _O_RDONLY );
    if (fp == -1)
    {
    char errmsg[1024];
    sprintf(errmsg, "文件打开错误,文件名:%s",fullPath);
    WriteLog(1, errmsg);
    return false;
    }
    else if (fp == 0)
    return false;
    unsigned int filelen = _lseek(fp, 0L, SEEK_END);
    _lseek(fp, 0L, SEEK_SET);
    if (fp)//查询错误日志直接读,不用按照业务编码查询
    size_t = _read(fp, FileContent, filelen+1);
    _close(fp);
    FileContent[size_t] = 0;
    if (size_t >= filelen)
    {
    is_read = false;    //读取失败
    FileContent[0] = 0;
    char errmsg[1024];
    sprintf(errmsg, "文件超长,读取失败,文件名:%s", fullPath);
    WriteLog(1, errmsg);
    }
    else
    is_read = true;
    return is_read;
    }
    这个我试过10几M的文件没有问题,再大的我就不知道了!