当前位置: 技术问答>linux和unix
recv soket gif
来源: 互联网 发布时间:2016-05-11
本文导语: 下面为一段学习测试程序,使用socket下载webserver上的gif文件,然后保存在本地。 现在程序已经能够把server上的文件保存在本地,而且字节也相等(我是直接查看文件属性看的)。 问题是:下载的gif文件不能正确显示...
下面为一段学习测试程序,使用socket下载webserver上的gif文件,然后保存在本地。
现在程序已经能够把server上的文件保存在本地,而且字节也相等(我是直接查看文件属性看的)。
问题是:下载的gif文件不能正确显示,不能显示为一张图片。
测试环境:
------------------
gcc version 3.4.2(mingw-special)
windows xp
--------------------
现在程序已经能够把server上的文件保存在本地,而且字节也相等(我是直接查看文件属性看的)。
问题是:下载的gif文件不能正确显示,不能显示为一张图片。
测试环境:
------------------
gcc version 3.4.2(mingw-special)
windows xp
--------------------
#include
int main(int ac,char *av[])
{
char pack[1024] = {0} ;
sprintf(pack,"GET /images/dragon.gif HTTP/1.1nHost: localhostnAccept: */*nReferer: http://127.0.0.1nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)nRange: bytes=0-nPragma: no-cachenCache-Control: no-cachenn") ;
int server ;
server = socket(AF_INET,SOCK_STREAM,0) ;
struct sockaddr_in server_addr ;
server_addr.sin_family = AF_INET ;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1") ;
unsigned int port ;
port = 80 ;
server_addr.sin_port = htons(port) ;
connect(server,(struct sockaddr*)&server_addr,sizeof(server_addr)) ;
send(server,pack,strlen(pack),0) ;
char buf[267017] = {0} ;
char tbuf[1024] = {0} ;
memset(buf,'',sizeof(buf));
memset(buf,'',sizeof(tbuf));
int i ;
i = 0 ;
char * body = NULL ;
int t ;
t = 0 ;
//this sentence is very important to receive the data complete
do
{
t = recv(server,tbuf,sizeof(tbuf),0) ;
strcat(buf,tbuf) ;
i = t + i ;
}
while(t>0) ;
printf("i value:%dn",i) ;
body=strstr(buf,"rnrn")+4; //detech and drop http response header
i=i-(body-buf);
/*/kendo,debug
printf("n%sn",buf) ;
//*/
FILE* f = NULL ;
f = fopen("shex.gif","wb+") ;
fwrite(body,sizeof(char),i,f) ;
fflush(f) ;
fclose(f) ;
printf("i value:%dn",i) ;
close(server) ;
return 0 ;
}
|
既然是二进制文件了,你还这样写?
do
{
t = recv(server,tbuf,sizeof(tbuf),0) ;
strcat(buf,tbuf) ;
i = t + i ;
}
while(t>0) ;
--------------------------------
int t ;
cuar *ptr=buf;
t = 0 ;
//this sentence is very important to receive the data complete
do
{
t = recv(server,tbuf,sizeof(tbuf),0) ;
memcpy(ptr,tbuf,t);
ptr+=t;
i = t + i ;
}
while(t>0) ;
body=strstr(buf,"rnrn")+4; //这是做什么的?str*系列函数都是针对于字符串的,不能用在二进制数据上。不过你在这用也行,因为你的二进制数据在后边。
do
{
t = recv(server,tbuf,sizeof(tbuf),0) ;
strcat(buf,tbuf) ;
i = t + i ;
}
while(t>0) ;
--------------------------------
int t ;
cuar *ptr=buf;
t = 0 ;
//this sentence is very important to receive the data complete
do
{
t = recv(server,tbuf,sizeof(tbuf),0) ;
memcpy(ptr,tbuf,t);
ptr+=t;
i = t + i ;
}
while(t>0) ;
body=strstr(buf,"rnrn")+4; //这是做什么的?str*系列函数都是针对于字符串的,不能用在二进制数据上。不过你在这用也行,因为你的二进制数据在后边。
|
检查下这两个二进制文件是否也相同,看是不是丢失头标识之类的
|
楼主要搞清楚字符数组和字符串的区别。
|
strcat是有问题。直接接收到buf里就可以,不需要拷贝。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。