当前位置:  技术问答>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
--------------------
#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*系列函数都是针对于字符串的,不能用在二进制数据上。不过你在这用也行,因为你的二进制数据在后边。



|
检查下这两个二进制文件是否也相同,看是不是丢失头标识之类的

|
楼主要搞清楚字符数组和字符串的区别。

|
strcat是有问题。直接接收到buf里就可以,不需要拷贝。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • recv如何使用?
  • 虚拟机的linux,在其中运行Server和Client,Server端send了一个大小4096B的包,客户端recv到3845B,用netstat查看连接,Recv-Q和Send-Q项显示为0,为什么没收完?其余字节哪去了??
  • socket编程 是recv阻塞
  • socket编程:recv(...)函数问题求救
  • recv在什么情况下会返回0
  • socket tcp 关于 alarm() 和 recv() ?
  • 请教soclet中recv()函数最大返回值的问题
  • 对recv函数第四个参数置0的疑问
  • 关于recv函数的问题
  • linux 网络编程 recv函数
  • HTML标签参考手册 iis7站长之家
  • 请问 : read, 与recv 两个函数有什么区别啊?
  • recv 接收 ,接收空间不够大, 可以通过什么知道?
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 关于socket的send(),recv()的问题.
  • socket中的疑问:read,write和send,recv的区别
  • 求助:关于单线程recv时的超时问题
  • linux c 网络编程时用 recv 函数
  • 请问:SCO UNIX下SOCKET的recv返回-1,errno=9?在线等·····
  • socket编程中的函数send和recv如何被信号中断?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3