您的位置:首页 > 编程语言

试验一下CSDN的插入代码功能

2008-08-23 14:23 405 查看
以下代码实现了简易的根据URL下载网页的功能,原始链接已经找不到了,不过代码头部有作者信息。

/*

Wget V. 0.7 Download File Form Url

by wzt <[email]wzt@xsec.org[/email]>

*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <netinet/in.h>

#include <netdb.h>

#include <time.h>

#define MAXLINE 65535

#define SENDDATA 1000

#define PORT 80

struct hostent *host;

char *data_m="Accept: */*/r/n"

"Accept-Language: zh-cn/r/n"

"UA-CPU: x86/r/n"

"Accept-Encoding: gzip, deflate/r/n"

"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; TencentTraveler ; .NET CLR 1.1.4322)/r/n";

char *data_e="Connection: Keep-Alive/r/n/r/n";

typedef struct DWONLOAD_FILE{

char hosts[100];

char ports[200];

char file[200];

int port;

}DOWN;

void usage(char *pro);

void ver();

DOWN abstract_host(char *src);

void download_file(char *url_t,char *local_file);

int connect_server(int port);

void usage(char *pro)

{

ver();

printf("usage : %s <remote file> <local file>/n",pro);

printf("exp: %s http://tthacker.sitesled.com/backdoor/bindtty.c bindtty.c/n",pro);

exit(0);

}

void ver()

{

printf("/nWget Ver 0.6 by W.Z.T, [email]wzt@xsec.org[/email] 2006/10/27/n");

}

int connect_server(int port)

{

struct sockaddr_in remote;

int sock_id;

if((sock_id=socket(AF_INET,SOCK_STREAM,0))<0){

perror("sock_id");

exit(0);

}

remote.sin_family=AF_INET;

remote.sin_port=htons(port);

remote.sin_addr=*((struct in_addr *)host->h_addr);

if(connect(sock_id,(struct sockaddr *)&remote,sizeof(struct sockaddr))<0){

perror("connect");

return -1;

}

printf("/n[+] Connect :%s:%d OK!/r/n",inet_ntoa(remote.sin_addr),ntohs(remote.sin_port));

return sock_id;

}

void download_file(char *url_t,char *local_file)

{

DOWN file_get;

FILE *fp;

time_t t_s,t_e;

char download_url[SENDDATA];

char recv_data[MAXLINE];

int sock_fd;

long get_file_len=0;

int r_len;

int http_check;

char *real_data_pos;

ver();

file_get=abstract_host(url_t);

printf("/n[+] Host :%s/n",file_get.hosts);

printf("[+] Port :%d/n",file_get.port);

printf("[+] File :%s/n",file_get.file);

if((fp=fopen(local_file,"w+"))==NULL){

printf("/n[-] Create Local File %s Failed./n",local_file);

exit(1);

}

if((host=gethostbyname(file_get.hosts))==NULL){

herror("gethostbyname");

exit(0);

}

// 提交url

sprintf(download_url,"GET %s HTTP/1.1/r/n%sHost: %s/r/n%s",file_get.file,data_m,file_get.hosts,data_e);

// printf("%s",download_url);

sock_fd=connect_server(file_get.port);

if(sock_fd==-1){

printf("connect error./n");

exit(1);

}

time(&t_s);

printf("/n[+] Starting Download at %s",ctime(&t_s)+4);

// 接受并处理第-批数据

write(sock_fd,download_url,strlen(download_url));

r_len=read(sock_fd,recv_data,MAXLINE);

// printf("%s",recv_data);

http_check=atoi(recv_data+9);

// printf("%d/n",http_check);

if(http_check == 200 || http_check == 206){

// printf("/n[+] Download Begin .../n");

}

else{

printf("/n[-] Bad request./n");

exit(1);

}

// 获得文件大小

get_file_len=atoi(strstr(recv_data,"Content-Length: ")+16);

printf("/n[+] File Size: %ld/n",get_file_len);

// 寻找真正的文件开始位置

real_data_pos=strstr(recv_data,"/r/n/r/n")+4;

fputs(real_data_pos,fp);

// 循环读取数据

memset(recv_data,0,MAXLINE);

while((r_len=read(sock_fd,recv_data,MAXLINE))>0){

fputs(recv_data,fp);

// printf("%d/n",r_len);

memset(recv_data,0,MAXLINE);

}

fclose(fp);

time(&t_e);

printf("/n[+] Download File OK at %s",ctime(&t_e)+4);

}

DOWN abstract_host(char src[])

{

DOWN file_download;

char *http="http://";

int port;

int port_flag=0;

int i,j=0,k,l=0,h;

i=strlen(http);

for(;i<strlen(src);i++){

if(src[i]==':'){

port_flag=1;

h=i-1;

i++;

for(;src[i]!='/';i++){ /* 提取ports */

file_download.ports[j++]=src[i];

}

file_download.ports[j]='/0';

}

if(src[i]=='/'){

k=i-1;

break;

}

}

/////////////////////////////////////////////////////////////////////

for(;i<strlen(src);i++){ /* 提取file */

file_download.file[l++]=src[i];

}

file_download.file[l]='/0';

////////////////////////////////////////////////////////////////////

i=strlen(http); /* 提取主机名 */

j=0;

k=((port_flag==1)?h:k);

for(;i<=k;i++)

file_download.hosts[j++]=src[i];

file_download.hosts[j]='/0';

////////////////////////////////////////////////////////////////////

if(port_flag==0) /* 提取port */

file_download.port=PORT;

else

file_download.port=atoi(file_download.ports);

////////////////////////////////////////////////////////////////////

return file_download;

}

int main(int argc,char **argv)

{

if(argc<3){

usage(argv[0]);

}

download_file(argv[1],argv[2]);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: