/*************************************************************/
接收端/*************************************************************/
 char buffer[1024];
     char temp[1024];
 char *pBuffer;
     memset(buffer,0,sizeof(buffer));
      memset(temp,0,sizeof(temp));
     int rcv = recv(sClient,buffer, 1024, 0);
 int i=0;
     for (; buffer[i]!='*'; i++)
 {
     temp[i] = buffer[i];
 }      temp[i++] = '\0';
         long lFileSize = atol(temp);
         printf("%ld",lFileSize);         pBuffer=new char[lFileSize+1];
 pBuffer[0]='\0';
 char* pBuf = pBuffer;
 long iTemp = 0;
 for (int j=i; j<rcv; j++)
 {
  pBuf[iTemp] = buffer[j];
  iTemp++;
 }
 while (1)
 {
rcv = recv(sClient, buffer, 1024, 0);
if (iTemp >= lFileSize)
{

break;
}
for (int ij=0; ij<rcv; ij++)
{
pBuf[iTemp] = buffer[ij];
                iTemp++;
}
iTemp = iTemp+rcv;
}
 pBuf[lFileSize] = '\0';//因为上传在缓冲区中的文件大小多出几十位,所以我在这里截了,好象不行吧
printf("%ld",strlen(pBuf));
       FILE *file = fopen("c:\\nn15.bmp","w");
        
       // FILE *file = fopen("c:\\nn1.bmp","w");
       /// printf("%d",strlen(cpy1));
        fwrite(pBuf,strlen(pBuf),1,file); 
        fclose(file); //打开图片就因为少了几十位就会打不开图片么???/**********************************************/上传端
/***********************************************/
 FILE *pFile;    //原文件流
    FILE *pFileSave;//目标文件流
    int iTmp = 0;
//打开源文件 ,只读方式
    pFile = fopen("c:\\lpFileName.bmp","rb");
if(pFile == NULL){ 
          printf("%s : No such file or directory.\nFailed to open file for reading.\n"); 
} fseek(pFile,0L,2);
    long lenbuf = ftell(pFile);
char *buffpic = new char[lenbuf+1];//开辟长度缓冲区
memset(buffpic,0,sizeof(buffpic));//清0    fread(buffpic, lenbuf+1, 1,pFile);//读入输入流
//::send(s,buffpic,lenbuf+1,0);
char temp[260];
memset(temp,0,sizeof(temp));//缓冲区清0
    ltoa(lenbuf, temp, 10);//文件长度
int templen = strlen(temp);//转整形
char *filebuff = new char[templen+lenbuf+2]; //将数据存入缓冲区
    memcpy(filebuff, temp, templen); 
    *(filebuff + templen) = '*';
    memcpy(filebuff+templen+1, temp, templen);
    *(filebuff + templen + lenbuf + 1) = '\0';
iTmp =::send(s,filebuff,strlen(filebuff),0);
    //printf("%d",templen);

解决方案 »

  1.   

    首先,上传端的代码有问题:iTmp =::send(s,filebuff,strlen(filebuff),0);这里不能用strlen(filebuff),直接用templen+lenbuf+1就行了,因为你从文件中读出的数据可能有0。再说接收端:首先,第一次调用recv的时候,没判断实际收到的数据长度,也许只有1字节。根本没收到'*'那里。尽管从你的代码看,这种可能性小,但是逻辑上应该处理好。保证收到的长度足够了(比如超过10个字节,对于4G以下的文件都不会超过)才去判断"*"的位置。其次,看下面这段代码,错的很离谱,应该就是你收到的数据不全的原因:
    while (1)
    {
      rcv = recv(sClient, buffer, 1024, 0);
      if (iTemp >= lFileSize)
      {
                    
          break;
      }
      for (int ij=0; ij<rcv; ij++)
      {
         pBuf[iTemp] = buffer[ij];
         iTemp++;    //这里循环完之后,iTemp已经加了rcv次了。
      }
      iTemp = iTemp+rcv; //所以这加重复。每收到1字节,你计数是2字节。所以只收了一半的数据循环就结束了。
    }应改成这样:
    while (1)
    {
      rcv = recv(sClient, buffer, 1024, 0);
      if (rcv == -1)
      {
          //链路异常断开了
          break;
      }
      else if(rcv == 0)
      {
          //这种情况就是lFileSize计算错了有可能出现。
          break;
      }
      for (int ij=0; ij<rcv; ij++)
      {
         pBuf[iTemp++] = buffer[ij];
      }
      if (iTemp >= lFileSize)
      {
         break;
      }
    }
    再次,pBuf[lFileSize] = '\0';//因为上传在缓冲区中的文件大小多出几十位,所以我在这里截了,好象不行吧
    这里没问题,实际上从发送端看,发送的文件数据长度就是lFileSize,所以这里没有截掉数据。关键是这样做意义不大。因为你传递的不是纯粹的'\0'结尾的字符串,而是二进制文件数据,不能依靠'\0'来判断结束。所以后面printf("%ld",strlen(pBuf));这个没意义。然后看FILE *file = fopen("c:\\nn15.bmp","w");这里应该明确指定"wb",按二进制写数据。最后fwrite(pBuf,strlen(pBuf),1,file); 这个strlen(pBuf)错了,应该用lFileSize。
      

  2.   

    见下面标红的内容。while (1)
             {
                rcv = recv(sClient, buffer, 1024, 0);
                if (iTemp >= lFileSize)
                {
                    
                    break;
                }
                for (int ij=0; ij<rcv; ij++)
                {
                    pBuf[iTemp] = buffer[ij];
                    iTemp++;//很明显,这里你已经++了,后面就不用再加了
                }
                iTemp = iTemp+rcv;//这里不用再加了
            }
    另外对你的发送提个意见,打开文件读取时用一个缓冲区反复读取,不要一次读取,有时文件大了不一定一次读取完,在发送时也是一样,用while反复发送,因为由于网络原因,不可能一次将缓冲区中的数据全部发送成功。