#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "cJSON.h"
//http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=%E7%BE%8E%E5%A5%B3&tag2=%E5%85%A8%E9%83%A8&ie=utf8
#define HTTP_REQ "GET/channel/listjson?pn=0&rn=3&tag1=%E7%BE%8E%E5%A5%B3&tag2=%E5%85%A8%E9%83%A8&ie=utf8 \
HTTP/1.1\r\nHost: image.baidu.com\r\nConnection: close\r\n\r\n"
/* https://cache.yisu.com/upload/information/20200302/31/2616.jpg
https://cache.yisu.com/upload/information/20200302/31/2617.jpg
https://cache.yisu.com/upload/information/20200302/31/2620.jpg */
#define HTTP_REQ_PIC "GET/image/pic/item/%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n"
void *download_run(void *arg)
{
char *t=(char *)arg;
char buf[strlen(t)+1];
memcpy(buf, t, strlen(t)+1);
char www[64]={0};
char pic[128]={0};
sscanf(buf, "http://%[^/]/image/pic/item/%s", www, pic);
printf("%s---%s\n", www, pic);
char requstbuffer[1024]={0};
sprintf(requstbuffer, HTTP_REQ_PIC, pic, www);
//1.连接服务器
int sockfd=插座(AF_INET SOCK_STREAM 0);
如果sockfd & lt;0)
{
返回NULL;
}
结构指向sockaddr_in saddr;
bzero(和saddr, sizeof (saddr));
saddr。sin_family=AF_INET;
,,saddr。sin_port=htons(80);//服务器端口号
saddr.sin_addr。s_addr=inet_addr (“119.146.74.48");//服务器地址
int ret=连接(sockfd, (struct sockaddr *), saddr, sizeof (saddr));
如果(ret & lt;0)
{
perror(“连接fail");
}
//2。发送http请求
写(sockfd、requstbuffer strlen (requstbuffer));
字符缓冲区[1024]={0};
char * p=malloc (1024 * 300);
char * q=p;
unsigned int recvsize=0;
, (1)
{
int ret=阅读(sockfd,缓冲区,1024);
如果(ret & lt;=0)打破;
memcpy (q,缓冲区,ret);
q +=ret;
recvsize +=ret;
memset(缓冲区,0,sizeof(缓冲));
}
=strstr (p,“\ r \ n \ r \ n") + 4;,//获取图片数据结束符后面的有效图片数据
文件*文件=fopen(图片,“w +“);
写入文件(q, recvsize - (qp), 1,文件),
文件关闭(文件);
自由(p);
}
int主要(void)
{
//1。连接服务器
int sockfd=插座(AF_INET SOCK_STREAM 0);
如果sockfd & lt;0)
{
返回1;
}
结构指向sockaddr_in saddr;
bzero(和saddr, sizeof (saddr));
saddr。sin_family=AF_INET;
,,saddr。sin_port=htons(80);//服务器端口号
saddr.sin_addr。s_addr=inet_addr (“14.215.177.185");//服务器地址
int ret=连接(sockfd, (struct sockaddr *), saddr, sizeof (saddr));
如果(ret & lt;0)
{
perror(“连接fail");
}
//2。发送http请求
写(sockfd、HTTP_REQ strlen (HTTP_REQ));
//3。接收服务器应答数据
字符缓冲区[1024]={0};
char * p=malloc (2048 * 30 + 1200);
char * q=p;
, (1)
{
int ret=阅读(sockfd,缓冲区,1024);
如果(ret & lt;=0)打破;
memcpy (q,缓冲区,ret);
q +=ret;
memset(缓冲区,0,sizeof(缓冲));
}
//去掉http头
=strstr (p,“\ r \ n \ r \ n") + 4;
=strstr (q,“{”);
//去掉数据尾巴
char * tmp=strstr (q,“}]} \ r") + 3;
* tmp=& # 39; \ 0 & # 39;;
printf (“% s \ n" q);
//JSON数据解析
cJSON * obj=cJSON_Parse (q);
cJSON *数组=cJSON_GetObjectItem (obj,“data");
int大?cJSON_GetArraySize(数组);
int i=0;
(i=0; i<大小是1;我+ +)
{
cJSON * aobj=cJSON_GetArrayItem(数组,i);
cJSON * picObj=cJSON_GetObjectItem (aobj,“image_url");
//printf (“% s \ n", picObj→valuestring);
//创建线程下载数据
pthread_t id=0;
pthread_create(和id、零download_run, (void *) picObj→valuestring);
usleep (10000),
pthread_detach (id);}
自由(p);
获取字符();
,,,,获取字符();//此两处为了不让主程序退出,影响线程下载图片