通过TCP协议传输用zlib压缩的图像文件解压出错 把一个大的图像分成64块,每块用zlib的compress2函数压缩,通过TCP协议传输。接收电脑接受数据后用uncompress解压缩。但只有1/3的块解压成功。其它的解压返回值为-3(数据错)。几天,还不知是TCP还是ZLIB的问题.请知道的提个醒,是哪个方面会出问题.谢谢. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不用Zlib压缩,64块能全部显示。tcp传输不会掉数据吧,难道Zlib解码跟电脑有关?请碰到过此类问题的同仁,拉一把。谢谢! 如何传输的,send/recv是如何写的? send数据是包头指明后面数据大小。recv先接收包头的长度(固定的)数据,再根据包头里指明的长度接收数据。 我希望能够看到具体的实现.包括send/recv对返回值的处理.这个也是最为关键的.然后发送数据的结构定义等. 谢谢回复。代码在单位电脑上.现在想想大至如下:结构: struct SendData{ int len; //数据长度 POINt pt; //鼠标点 RECT rect;//图像位置};SendData senddata;senddata 赋值byte buff[6000];datalen=sizeof(senddata));memcpy(buff,senddata,datalenint comlen=compress2();//压缩数据memcpy(&buff[datalen],压缩数据,comlen);send(sock,buff,datalen+comlen,0);接收: struct RecvData{ int len; //数据长度 POINt pt; //鼠标点 RECT rect;//图像位置};byte buff[6000];RecvData recvdata;recvlen=sizeof(recvdata);while(true){ countlen=0; templen=recvlen; while(templen>0) //接收包头 { len=recv(sock,buff,templen,0); if(len>0) { countlen+=len; templen-=len; } } memcpy(&recvdata,buff,recvlen); templen=recvdata.len; while(templen>0) //接收数据 { len=recv(sock,&buff[countlen],templen,0); if(len>0) { countlen+=len; templen-=len; } } int unlen; uncompress(&buff1,&unlen,buff[recvdata.len],countlen);有些解压缩出错 } send也要跟recv那样对返回值进行处理.另外当recv返回小于0,即len<=0的时候,上面的代码会死循环. 做个CRC32校验.发送方和接收方对zlib加压数据都做个CRC32校验,如果一样,那么数据是没错,但还是显示错误,自然是解压的问题了.如果CRC32校验不一样,那就是你传输过程出问题了. 原代码只是对Send返回值错误的,提示信息.程序运行没有提示出错.对于recv<=0的情况.我特意不去处理,让程序继续接收数据. 这是一个好方法,可惜不会做CRC32校验.请教算法.谢谢. zlib1.2.3 好象带MD5校验,不知如何用.谢谢. 只是测试程序。已找到是Zlib的原因。谢谢 关于数据编码的小问题 对话框类on timer()是否会被其它成员函数抢占? 求助一个和矩阵有关的VC算法 大家认为这意味着什么 WCHAR(宽字节)数组操作问题 delete 的问题 怎么创建这个样式? 大家都来看看~~~ vc++ 入门到基本掌握 用什么书好.?> 我没可用分了,一会加上来! 读入的二进制流转换为字符串 即时通讯软件的端口绑定问题
结构:
struct SendData
{
int len; //数据长度
POINt pt; //鼠标点
RECT rect;//图像位置
};
SendData senddata;
senddata 赋值
byte buff[6000];
datalen=sizeof(senddata));
memcpy(buff,senddata,datalen
int comlen=compress2();//压缩数据
memcpy(&buff[datalen],压缩数据,comlen);
send(sock,buff,datalen+comlen,0);接收: struct RecvData
{
int len; //数据长度
POINt pt; //鼠标点
RECT rect;//图像位置
};
byte buff[6000];
RecvData recvdata;
recvlen=sizeof(recvdata);
while(true)
{
countlen=0;
templen=recvlen;
while(templen>0) //接收包头
{
len=recv(sock,buff,templen,0);
if(len>0)
{
countlen+=len;
templen-=len;
}
}
memcpy(&recvdata,buff,recvlen);
templen=recvdata.len;
while(templen>0) //接收数据
{
len=recv(sock,&buff[countlen],templen,0);
if(len>0)
{
countlen+=len;
templen-=len;
} }
int unlen;
uncompress(&buff1,&unlen,buff[recvdata.len],countlen);有些解压缩出错 }
做个CRC32校验.发送方和接收方对zlib加压数据都做个CRC32校验,如果一样,那么数据是没错,但还是显示错误,自然是解压的问题了.如果CRC32校验不一样,那就是你传输过程出问题了.
原代码只是对Send返回值错误的,提示信息.程序运行没有提示出错.对于recv<=0的情况.我特意不去处理,让程序继续接收数据.
只是测试程序。已找到是Zlib的原因。谢谢