/*************************************************************/
接收端/*************************************************************/
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);
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。
{
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反复发送,因为由于网络原因,不可能一次将缓冲区中的数据全部发送成功。