免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1863 | 回复: 3
打印 上一主题 下一主题

[C] recv socket gif [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-17 14:45 |只看该作者 |倒序浏览
下面为一段学习测试程序,使用socket下载webserver上的gif文件,然后保存在本地。
现在程序已经能够把server上的文件保存在本地,而且字节也相等(我是直接查看文件属性看的)。
问题是:下载的gif文件不能正确显示,不能显示为一张图片。

测试环境:
------------------
gcc version 3.4.2(mingw-special)
windows xp
--------------------


int main(int ac,char *av[])
{
    char pack[1024] = {0} ;
    sprintf(pack,"GET /images/dragon.gif HTTP/1.1\nHost: localhost\nAccept: */*\nReferer: http://127.0.0.1\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 9\nRange: bytes=0-\nPragma: no-cache\nCache-Control: no-cache\n\n") ;
   
    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,'\0',sizeof(buf));
    memset(buf,'\0',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:%d\n",i) ;
   
    body=strstr(buf,"\r\n\r\n")+4;    //detech and drop http response header

   
    i=i-(body-buf);
    /*/kendo,debug
    printf("\n%s\n",buf) ;
    //*/

   
    FILE* f = NULL ;
   
   
    f = fopen("shex.gif","wb+") ;
   
    fwrite(body,sizeof(char),i,f) ;
    fflush(f) ;
   
    fclose(f) ;
   
    printf("i value:%d\n",i) ;
   
   
    close(server) ;
    return 0 ;
}


[ 本帖最后由 kendotom 于 2008-6-17 14:48 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-06-17 16:07 |只看该作者
如果是windows下,connect之前,应该有个初始化函数需要调用
你搜索一下吧

论坛徽章:
0
3 [报告]
发表于 2008-06-17 17:59 |只看该作者
楼上的,楼主已经把文件取下来了,当然不存在什么问题了。Mingw是做了封装的。

这段代码明显错了吧:
    do
    {
        t = recv(server,tbuf,sizeof(tbuf),0) ;
        strcat(buf,tbuf) ;
        i = t + i ;
    }
    while(t>0) ;
图片又不是字符串,用strcat谁知道会追一些什么数据上去啊。楼主是学生吗?这个程序问题太多了,而且定位的手段也太少了,实际上第一步要想到的应该是同时用浏览器下载一个正确的图片,然后用BeyondCompare之类的比较一下数据内容,而不是到这里直接提问。

程序中缓冲区的大小没有考虑,另外对于HTTP协议头部标准的应该是\r\n而不是\n吧,还有你只想每个连接只请求一个文件应该指定Connection:close,否则服务器发完数据会等待一段时间,导致下载变慢。

论坛徽章:
0
4 [报告]
发表于 2008-06-17 18:39 |只看该作者
to:楼上。
这里我确实没注意到(strcat部分)

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP