BBS水木清华站∶精华区

发信人: andrewleu (淡入淡出), 信区: Linux        
标  题: 改写了proxysearch.c 
发信站: BBS 水木清华站 (Wed Jul 14 06:37:11 1999) 
 
/*原来的proxysearch.c 与proxyverify.c是两个不同的文件 
我将其合并.*/ 
/*我发现 GET http://www.hotmail.com一句 
netscape 的proxy server返回差错,所以 
这个程序并不能找到所有的free proxy*/ 
/* 应各位的要求, 贴上Happy的原作.         --calvin@scut*/  
/* free proxy搜索程序,for UNIX                          */  
/* 用法: 程序名  起始IP地址  结束IP地址   日志文件      */  
/* 本程序将把搜索结果存于日志文件中                     */  
/*  Author: Happy(Netguy) Revised by Andrew             */  
      
#include <stdio.h>  
#include <netinet/in.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <sys/signal.h>  
#include <sys/time.h>  
#include <fcntl.h>  
#include <unistd.h>  
/* 如果编译通不过,可以把下面一行改为 #include <sys/ioctl.h>  */  
#include       <sys/ioctl.h>  
  
#define N 1      
#define BUFLEN  512   
int              port[N]={  
8080/*81,88,8083,*/ 
/*8001,8888,3128,3124,*/ 
/*3000*/ 
/*1080*/ 
}; /* 欲搜的端口号 */  
char            target[]="GET  http://www.hotmail.com/\n";/*HTTP命令*/ 
int              status=-1;  
char             serverName[20];  
u_char           p1,p2,p3,p4;  
int              sockfd=-1;  
struct timeval   timeout={2,0};  
fd_set    mask;  
FILE             *f=NULL;  
int              err;  
int              errlen;  
u_long           startIP,endIP,k;  
int              found=0; 
char            buf[BUFLEN];      /* 缓冲区                   */ 
 
 
void terminate(int signo)                    /* 异常中止处理子程序 */  
{   
    p1=(u_char)( (k>>24) & 0xFF);  
    p2=(u_char)( (k>>16) & 0xFF);  
    p3=(u_char)( (k>>8 ) & 0xFF);  
    p4=(u_char)(  k      & 0xFF);  
    fprintf(f,"%d.%d.%d.%d killed.\n",p1,p2,p3,p4);  
    fclose(f);  
    if(sockfd>0) close(sockfd);  
    exit(0);  
}  
int verify() 

    fd_set rmask; int ve; 
    status=write(sockfd,target,sizeof(target)); /* 写入GET命令给server */ 
    timeout.tv_sec=9; 
    timeout.tv_usec=0; /* 超时限制 */ 
    FD_ZERO( & rmask); 
    FD_SET(sockfd,& rmask); 
    status=select(sockfd+1,& rmask,(fd_set *) 0,(fd_set *) 0,& timeout); 
    switch(status) 
    { case -1: 
          //fprintf(out,"select error\n"); 
          break ; 
     case 0:            /* 超时了 */ 
          close(sockfd); 
          break; 
     default:           /* 连上了 */ 
      if(  FD_ISSET(sockfd,& rmask) ) 
      { 
         bzero(buf,BUFLEN);                /* 清缓冲区           */ 
         status=read(sockfd,buf,BUFLEN);   /* 读server的返回结果 */ 
         close(sockfd); 
         if(status>0)            
           /* 下面的语句采用Digital公司的主页作为判断free proxy的依据.如果其主页内容 
              了,那麽相应的程序段也要改 
            */ 
         printf("%s\n",buf); 
;         ve=strncmp((buf+50),"Type:",5); 
         if(  !(ve) )   /* 是free proxy吗 ?*/ 
         { 
           return(1); 
        } 
      }return(0); 
   } 

void findProxy(u_long addr)  
{  
        int i;  
        struct sockaddr_in host;  
          
/*  若连上了主机,则看其所有有可能提供proxy服务的端口 */  
  
        for(i=0;i<N;i++)  
      {  
        host.sin_family=AF_INET;  
        host.sin_addr.s_addr=htonl(addr);  
        host.sin_port=htons(port[i]);  
  
        if ( (sockfd=socket(AF_INET,SOCK_STREAM,0))<0 )  
        { fprintf(f," Error open socket\n");  
          exit(-1);  
        }  
  
      
        /* 试连一个可能提供proxy服务的一个端口  */  
        /* O_NDELAY = FNDELAY = O_NONBLOCK */  
  
        if(fcntl(sockfd,F_SETFL,O_NDELAY) < 0 )   /* 非阻塞式socket */  
        { fprintf(f,"fcntl() error\n");  
          exit(-1);  
        }  
        status=connect(sockfd,(struct sockaddr *)& host,sizeof(host));  
        timeout.tv_sec=1;  
        timeout.tv_usec=0;   /* 超时限制 */  
        FD_ZERO( & mask);  
        FD_SET(sockfd,& mask);  
        status=select(sockfd+1,( fd_set *)0,& mask, (fd_set *)0,& timeout);  
        switch(status)  
        { case -1:  
                  fprintf(f,"select error\n");  
                  fclose(f);  
                  close(sockfd);  
                  exit(-1);  
          case 0:                               /* 连接超时 */  
                  close(sockfd);  
                  return;  
          default:                              /* 连上了 */  
                  if(  FD_ISSET(sockfd,& mask) )  
                  { err=1;  
                    errlen=1;  
                    getsockopt(sockfd,SOL_SOCKET,SO_ERROR,(char *)&err,&errlen);  
                    if(err==0)  
                     if(verify()) 
                       fprintf(f,"%s\t%d\n",serverName,port[i]);  
                  }  
        }  
        close(sockfd);  
        fflush(f);  
      }  
}  
  
main(int argc,char *argv[])  
{   
  
  int i;  
  
  if(argc!=4)  
  { printf("Usage: %s  startIP endIP logFile\n",argv[0]);  
    exit(-1);  
  }  
    
  startIP=ntohl(inet_addr(argv[1]));            /* 搜索的IP范围 */  
  endIP=ntohl(inet_addr(argv[2]));  
  if(startIP>endIP)  
  { k=startIP;  
    startIP=endIP;  
    endIP=k;  
  }  
  
  f=fopen(argv[3],"a");                 /* 打开日志文件 */  
  if(f==NULL)  
  { printf("error open log file: %s\n",argv[3]);  
    exit(-1);  
  }  
  fprintf(f,"%s--------->%s\n",argv[1],argv[2]);  
  fflush(f);  
  
  printf("Searching proxy...\n");  
  printf("%s----------->%s\n",argv[1],argv[2]);  
  printf("\tport:\n");  
  for( i=0;i<N;i++)  printf("\t%d\n",port[i]);  
  
  signal(SIGTERM,terminate);            /* 异常中止处理 */  
  switch(fork())  
  { case 0:                             /* 子进程继续 */  
         break;  
    case -1:                            /* 出错       */  
         printf("fork() error\n");  
         exit(-1);  
    default:                            /* 父进程结束 */  
         fclose(f);  
         exit(0);  
  }  
  
  setpgrp();  
    
  i=open("/dev/tty",O_RDWR);            /* 切断与控制台的联系 */  
  if(i>=0)  
  {  ioctl(i,TIOCNOTTY,0);  
     close(i);  
  }  
  else  
   { fprintf(f,"TTY eacape error\n"); fflush(f); }  
  
  for(k=startIP;k<=endIP;k++)  
  { if( (k % 256)==0)  continue;       /* localhost */  
    if( (k % 256)==255) continue;      /* broadcast */  
    p1=(u_char)( (k>>24) & 0xFF);  
    p2=(u_char)( (k>>16) & 0xFF);  
    p3=(u_char)( (k>>8 ) & 0xFF);  
    p4=(u_char)(  k      & 0xFF);  
    sprintf(serverName,"%d.%d.%d.%d",p1,p2,p3,p4);  
    findProxy(k);  
  }  
  fprintf(f,"All done\n");  
  fclose(f); ; 
}  
  
 
 
-- 
bash:fortune :command not found 
 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.112.101.44] 

BBS水木清华站∶精华区