发送.txt文本文件就没事! 
比如接收1MB左右的文本文件 就没问题,内容都一样
但接收.jpg的图片文件就不行,虽然接收的字节大小没问题,但就是接收后打开显示的是乱码 无法显示图片图象
这是怎么回事呢? 
下面是代码
服务端用IOCP模型
在传输文件块时我用到了zlib压缩库
客户端:
         FILE *dfile=fopen(readfile,"rb");
int sendcount;
DWORD lastfileblock;
DWORD sendfilebyte=1024;
if (FileLength<sendfilebyte) 
{
sendcount=1;
        lastfileblock=FileLength;

if (FileLength>sendfilebyte) 
{
        sendcount=FileLength/sendfilebyte;
lastfileblock=FileLength%sendfilebyte;
}

 
if (lastfileblock!=0 && FileLength>sendfilebyte)
{
sendcount+=1;
}
int i;
for(i=0;i<sendcount;i++)
{
DWORD dwMsg;
if (i==sendcount-1 && lastfileblock!=0)
{
           dwMsg=lastfileblock;
}
else
dwMsg=sendfilebyte;
char *file_buf = new char[dwMsg]; 

fread(file_buf,1,dwMsg,dfile); 
                  压缩
                  send.....
         }
服务端:
        解压缩后
        到写入文件的函数
        WriteFile(hfile,pfile->singlefilepacket,sendfilebyte,&dwbuf,NULL);
         fileoffsetbyte+=1024;
SetFilePointer(hfile,fileoffsetbyte,0,FILE_BEGIN);

解决方案 »

  1.   

    建议你采用排除法试试看,例如,把txt或者图像文件总是采用rar压缩之后再传输,在接收端解压出来,先确认传输没有问题。
      

  2.   


    字符串是以可见字符组成,以0X00结尾的字节串,没仔细看你的代码,你会不会对发送和接收的数据用了类似STRLEN的方式判断长度?最好将CHAR[]或CHAR*改为UCHAR[]或UCHAR*,视觉上先别混乱
      

  3.   

    我以前碰见过类似问题,是接包端解压的时候,内存申请的太小了,txt和jpg的压缩率是不一样的,你看看是不是也犯了这个错误。
      

  4.   

    调试 uncompress解压后 有一段数据 与压缩前的数据不一样
    造成图片无法显示
      

  5.   

    我直接用的ZLIB库的 compress()函数压缩 
    服务端 用uncompress()解压缩
    难道 不能压缩jpg格式的图片吗
    哪位高手 给段代码 
      

  6.   

    估计是用到strcpy,strlen这类函数了,
      

  7.   

    嗯,MARK一下,以后有空再看。
      

  8.   

    先去掉压缩代码
    看看有没有问题
    没问题了再把压缩加上
    可能是压缩的问题
    TXT文件压缩前后一样,没有区别
    JPG压缩后就不同了
      

  9.   

    大概看了一下代码,接收端分配的内存似乎比发送的大。new char[n].char 在 32位机器上是2个bytes.如果我猜的不错,有一半分配的内存没用上。
      

  10.   

    楼主,你先找个小的.jpg的图片文件去传送,看下有没有问题。如果没问题就是续传问题。如果还是有问题,先把压缩部分先去掉,直接传图片可以不?如果你把文件名(带后缀)的都正确传过去,应该能显示正确。看下你有没把文件名的正确格式也传过去,自己检查下数据包的内容。  
      

  11.   

    WriteFile(hfile,pfile->singlefilepacket,sendfilebyte,&dwbuf,NULL);
    fileoffsetbyte+=1024;
    SetFilePointer(hfile,fileoffsetbyte,0,FILE_BEGIN);
    你默认写入的字节是1024,但是有可能不是1024