linux 简单的下载down

#include <stdio.h>
#include <stdlib.h>
#include <unistd.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>

int main ( int argc, char *argv[] )
{
int sockfd;
struct sockaddr_in server_addr;
char host[ 256 ] = "";
char *p_start = NULL;
char *p_end = NULL;

printf("--argv[1] = %s\n", argv[1] );
p_start = strstr( argv[1], "http://" );
p_start += strlen("http://");
p_end = strstr( p_start, "/" );
if( p_end == NULL )
strcpy( host, p_start );
else
memcpy( host, p_start , p_end-p_start);
printf("--%s---\n", host);

struct hostent *host_addr = NULL;
if((host_addr=gethostbyname( host ))==NULL)/*取得主机IP地址*/
{
fprintf(stderr,"Gethostname error, %s\n", strerror(errno));
exit(1);
}

FILE *fp = fopen("./text.flv", "w+");

bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(80);
server_addr.sin_addr=*((struct in_addr *)host_addr->h_addr);

sockfd = socket(AF_INET, SOCK_STREAM, 0);

printf("sockfd - %d\n", sockfd);

printf("host: %s-----\n%s", host, p_end );
char request[ 1024 ] = "";
sprintf(request, "GET %s HTTP/1.1\r\nRange: bytes=10000-\r\nHost: %s\r\nAccept-Encoding: defalte\r\n\r\n", p_end, host );
// sprintf(request, "GET %s?start=300 HTTP/1.1\r\nHost: %s\r\nAccept-Encoding: defalte\r\n\r\n", p_end, host );
// strcpy( request, "GET /img/image/1703bf33a87e950352abcaef36a5143fbf2b3118b81.jpg HTTP/1.1\r\nHost: img0.bdstatic.com\r\nAccept-Encoding: defalte\r\n\r\n");
int ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof( server_addr ) );
printf("connect res : %d\n", ret );
if( ret < 0 )
perror("connect error:");
send( sockfd, request, strlen( request ), 0 );
char buf[ 1024 ] = "";
int recv_len = 0;

recv_len = recv(sockfd, buf, sizeof( buf ), 0);
printf("buf --> %s\n",buf );
char *p = strstr( buf, "\r\n\r\n");
printf("\n\n---%d -- %d\n", recv_len , recv_len-(p+strlen("\r\n\r\n")-buf) );
int body_num =recv_len-(p+strlen("\r\n\r\n")-buf);
fwrite(p+strlen("\r\n\r\n"), body_num, 1, fp);
int sum = 0;
p = strstr( buf,"Content-Length:" );
if( p == NULL)
{
printf("--chunk---%s\n", buf);
exit( -1 );
}
int file_length = atoi( p+strlen("Content-Length: ") );
printf("---length : %d\n---", file_length);
file_length = file_length -body_num;
printf("---length : %d\n---", file_length);
do{
memset( buf, 0x00, sizeof(buf ));
recv_len = recv(sockfd, buf, sizeof( buf ), 0);
fwrite(buf ,recv_len ,1, fp );
sum += recv_len;
printf("----recv_len : %d sum : %d\n", recv_len, sum );
}while( sum < file_length );
fclose( fp );


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值