文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>一个wget的简单实现

一个wget的简单实现

时间:2007-03-30  来源:tthacker

很早就写了,今天在cu上发现有人问这个怎么实现,其实就是简单的socket编程,关键就是一些协议的操作而已.

/*
   Wget V. 0.7 Download File Form Url
   
   by wzt <[email][email protected][/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 [url]http://tthacker.sitesled.com/backdoor/bindtty.c[/url] bindtty.c\n",pro);
   exit(0);
}

void ver()
{
   printf("\nWget Ver 0.6 by W.Z.T, [email][email protected][/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;
}

相关阅读 更多 +
排行榜 更多 +
暗夜格斗手游

暗夜格斗手游

棋牌卡牌 下载
魔渊之刃手游

魔渊之刃手游

角色扮演 下载
像素火影次世代手游版

像素火影次世代手游版

体育竞技 下载