用纯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");

直接建立TCP通道,然后字符数组里面写"GET *.*\r\n……“然后send出去。
我习惯先用”取得头“的方法得到图片的大小,然后再用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

这是我在我的代码里用过的

参考技术A 这个好难啊。百度里面几乎没这样的人吧!问老师,朋友!追问

用libcurl / wget 库的话不难,但关键我想用精简的代码来实现这个功能

追答

我可不会,你在这里问没什么大作用的吧!

参考技术B 不考虑 借用其他库?
比如curl追问

不考虑,主要为了精简代码,实际上如果会写的话,代码量不会超过300行.

参考技术C 我建议你勿造车轮。用libcurl非常简单,四五行而已。递归创建目录也非难事。如果要自己写的话,你还要了解一下HTTP协议,跟要紧的是需要处理每次都可能不一样的HTTP返回头,代码可能会写几百行了。追问

不是造车轮,我是想在小型嵌入式设备实现这个功能的,NAND空间有限.

参考技术D 打个记号,来看有没有高手回答

以上是关于用纯C写一个下载HTTP协议的图片,并保存到指定目录中,如果目录不存在,自动创建(递归) 最高500分!的主要内容,如果未能解决你的问题,请参考以下文章

下载图片,并保存到指定大小和清晰度

用纯C语言 怎样编程,解析HTTP协议。

用纯C代码编写一个简单的HTTP客户端向服务器请求数据

获取网络图片并保存到指定目录

用vs2010编写C#程序,将图片保存到一个文件夹中,下次循环覆盖保存,提示gdi+中发生一般性错误。。。

下载知乎指定问题的答案并保存图片