用纯C写一个下载HTTP协议的图片,并保存到指定目录中,如果目录不存在,自动创建(递归) 最高500分!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用纯C写一个下载HTTP协议的图片,并保存到指定目录中,如果目录不存在,自动创建(递归) 最高500分!相关的知识,希望对你有一定的参考价值。
要求兼容Linux/Windows (如能顺便考虑BSD/Mac OSX更好,实际上Linux/Mac OSX/BSD兼容性更好搞一些)
#ifdef WIN32
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <winsock2.h>
#pragma comment( lib , "ws2_32.lib")
#else
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <limits.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ctype.h>
#endif
/**
char *url 要下载的URL连接 例如 http://www.baidu.com/index.php
char *dir 要保存的路径,例如 C:\test\test\index.php 当C:\test\test\ 目录不存在,递归创建
**/
int download(char *url,char *dir);
int download(char *url,char *dir)
//此处由您补充
int main(int argc, char *argv[])
if(argc!=2)
printf("Usage:%s URL DIR\a\n",argv[0]);
exit(1);
//Linux/BSD/Mac OSX
return download("http://www.baidu.com/index.php","/home/oopul/test/test/index.php");
return download("http://www.baidu.com/index.php","C:\test\test\index.php");
我习惯先用”取得头“的方法得到图片的大小,然后再用GET,以免收满了还在继续等。有些时候可以分段获取图片,从而实现多线程下载和断点续传,最后再合并。
至于递归创建目录就很简单了。追问
其实最后我还是用libcurl来实现了,不过我还是趋向于用系统的socket来实现请求。
不知道你能否写段演示代码??
我这分一直没能送出去呀
其实……你用wireshark抓个用IE打开或下载目标URL的包,你就知道要填什么了……
追问PHP我知道怎么实现socket下载,但C不熟
追答http://blog.csdn.net/dongliqiang2006/article/details/5850422
如果是服务器端就用bind和listen
如果是客户端就用connect
上面的链接是最简单的写法,基本上就是
tcp client/server 的一般编写步骤:
tcp client的套路:socket -> connect -> send/receive data -> close
tcp server的套路:socket -> bind -> listen -> accept -> send/receive data -> close
单个例子的我会,但是我想写的是兼容windows的同时也兼容Linux/Unix
类似的libcurl就是这样,他的代码兼容各种系统。但是这个库有几兆。
SOCKET是标准C库,所以是Windows/Linux通用的。
追问像你给我的例子的
1 #include
2 #include
3 #include /* socket, connect, etc. */
4 #include /* inet_aton, sockaddr_in, etc */
5 #include /* memset */
#include
#include
就没有
取而代之的是winsock
是没错,不过这个小意思吧?用#ifdef分情况include就行了
重点是代码部分没区别
对于一个新手来说,如果有源代码的话,学习会更快
追答#if defined WIN32
#include "windows.h"
#pragma comment(lib, "ws2_32.lib")
#elif defined linux
#include
#include
#include
#include
#include
#include
#endif
#if defined WIN32
#define CloseSocket(s) closesocket(s)
#elif defined linux
#define SOCKET int
#define INVALID_SOCKET (~0)
#define SOCKET_ERROR (-1)
#define CloseSocket(s) close(s)
#define WSAGetLastError() (errno)
#endif
这是我在我的代码里用过的
用libcurl / wget 库的话不难,但关键我想用精简的代码来实现这个功能
追答我可不会,你在这里问没什么大作用的吧!
参考技术B 不考虑 借用其他库?比如curl追问
不考虑,主要为了精简代码,实际上如果会写的话,代码量不会超过300行.
参考技术C 我建议你勿造车轮。用libcurl非常简单,四五行而已。递归创建目录也非难事。如果要自己写的话,你还要了解一下HTTP协议,跟要紧的是需要处理每次都可能不一样的HTTP返回头,代码可能会写几百行了。追问不是造车轮,我是想在小型嵌入式设备实现这个功能的,NAND空间有限.
参考技术D 打个记号,来看有没有高手回答以上是关于用纯C写一个下载HTTP协议的图片,并保存到指定目录中,如果目录不存在,自动创建(递归) 最高500分!的主要内容,如果未能解决你的问题,请参考以下文章