- 论坛徽章:
- 0
|
写了段代码,使用SOCKET进行HTTP下载,主要是HTTP头的格式化和处理。问题:接收文件不完整。代码如下,抱歉,没有优化,只是框架。
char HTTPhdr[] = "GET %s HTTP/1.1\r\n"
"Accept: */*\r\n"
"Host:%s\r\n"
"Connection: Keep-Alive\r\n\r\n";
int HTTPdl(char *addr)
{
int sockfd, i = 0;
FILE *fd;
char buf[1024*2];
struct addrinfo hints, *res;
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bzero(&hints, sizeof(hints));
hints.ai_flags = AI_CANONNAME;
hints.ai_family = AF_INET;
int geta;
geta = getaddrinfo(node(addr, "node"), "80", &hints, &res);
if(geta)
fprintf(stderr, "getaddrinfo error\n");
int cont;
cont = connect(sockfd, res->ai_addr, res->ai_addrlen);
if(cont)
fprintf(stderr, "connect error!\n");
bzero(buf, 1024*2);
sprintf(buf, HTTPhdr, node(addr, "filename"), node(addr, "node")); //node(),格式化地址,第二参数,filename输出文件名,node输出host;
int writex;
writex = write(sockfd, buf, strlen(buf));
if(writex <= 0)
fprintf(stderr, "send error!\n");
bzero(buf, 1024*2);
i = read(sockfd, buf, strlen("HTTP/1.1 200 OK")+2);
fprintf(stdout, "%s", buf);
int num = 0;
if(!strncmp("200 OK", buf+9, strlen("200 OK"))){
char *fname = strrchr(node(addr, "filename"), '/');
fd = fopen(fname+1, "wb");
if(!fd)
fprintf(stderr, "fd error!\n");
bzero(buf, 1024*2);
i = read(sockfd, buf, 1024*2);
int Lenght = filesize(buf); //filesize(),根据Content-Length字段输出文件大小;
char *tmp = NULL;
tmp = strstr(buf, "\r\n\r\n");
i = fwrite(tmp+4, sizeof(char), strlen(tmp+4), fd); //拆分HTTP头和数据;
*(tmp+4) = '\0';
fprintf(stdout, "%s", buf);
Lenght = Lenght - i; //以后做下载进度用;
while(1){
bzero(buf, 1024*2);
i = read(sockfd, buf, 1024*2);
if(i <=0)
break;
fwrite(buf, sizeof(char), i, fd);
num += i;
}
}
if(i <0)
fprintf(stderr, "recv error!\n");
fprintf(stdout, "file size %d\n", num);
close(sockfd);
fclose(fd);
return 0;
}
简陋 + 丑陋 + 菜鸟,各位包含~ |
|