axel搜索镜像文件

到今天为止,函数和数据结构的分析已经完成。

接下来对 搜索 和 下载 两部分的核心函数以及代码段做些分析,axel的分析就可以告一段落了

首先来看看搜索镜像文件这段代码:

  1. i = search_makelist( search, s );
  2.                 if( i < 0 )
  3.                 {
  4.                         fprintf( stderr, _("File not found\n" ) );
  5.                         return( 1 );
  6.                 }
  7.                 if( conf->verbose )
  8.                         printf( _("Testing speeds, this can take a while...\n") );
  9.                 //开始测速,其实就是看谁返回快
  10.                 j = search_getspeeds( search, i );
  11.                 //速度排序,按照时间由大到小排列,也就是速度由小到大排列
  12.                 search_sortlist( search, i );
复制代码
先看看search_makelist的分析:
  1. int search_makelist( search_t *results, char *url )
  2. {
  3.         int i, size = 8192, j = 0;
  4.         char *s, *s1, *s2, *s3;
  5.         conn_t conn[1];
  6.         double t;
  7.         
  8.         memset( conn, 0, sizeof( conn_t ) );
  9.         
  10.         conn->conf = results->conf;
  11.         t = gettime();
  12.         //源站点也算一个镜像,从此开始-----start
  13.         //填充连接的准备数据
  14.         if( !conn_set( conn, url ) )
  15.                 return( -1 );
  16.         //打开ftp或者http连接(ftp的话,要切换目录)
  17.         if( !conn_init( conn ) )
  18.                 return( -1 );
  19.         //获取文件信息。建立连接
  20.         if( !conn_info( conn ) )
  21.                 return( -1 );
  22.         
  23.         strcpy( results[0].url, url );
  24.         results[0].speed = 1 + 1000 * ( gettime() - t );//毫秒
  25.         results[0].size = conn->size;
  26.         //------源站点的搜索结束----finish
  27.         //因此,到目前为止,已经有一个资源链接了。

  28.         s = malloc( size );
  29.         //构造访问filesearching.com的URL地址
  30.         sprintf( s, "http://www.filesearching.com/cgi-bin/s?q=%s&w=a&l=en&"
  31.                 "t=f&e=on&m=%i&o=n&s1=%lld&s2=%lld&x=15&y=15",
  32.                 conn->file, results->conf->search_amount,
  33.                 conn->size, conn->size );
  34.         
  35.         //关掉原来的连接
  36.         conn_disconnect( conn );
  37.         memset( conn, 0, sizeof( conn_t ) );
  38.         conn->conf = results->conf;
  39.         //重新设置搜索的URL地址
  40.         if( !conn_set( conn, s ) )
  41.         {
  42.                 free( s );
  43.                 //因为已经有一个搜索返回结果了,因此需要返回1
  44.                 return( 1 );
  45.         }
  46.         if( !conn_setup( conn ) )
  47.         {
  48.                 free( s );
  49.                 return( 1 );
  50.         }
  51.         if( !conn_exec( conn ) )
  52.         {
  53.                 free( s );
  54.                 return( 1 );
  55.         }
  56.         //读取页面返回的结果
  57.         while( ( i = read( conn->fd, s + j, size - j ) ) > 0 )
  58.         {
  59.                 j += i;
  60.                 if( j + 10 >= size )
  61.                 {
  62.                         size *= 2;
  63.                         s = realloc( s, size );
  64.                         memset( s + size / 2, 0, size / 2 );
  65.                 }
  66.         }

  67.         conn_disconnect( conn );
  68.         //关闭连接后,从http结果中解析搜索到的资源
  69.         s1 = strstr( s, "<pre class=list" );//开始标志
  70.         s1 = strchr( s1, '\n' ) + 1;
  71.         if( strstr( s1, "</pre>" ) == NULL ) //结束标志
  72.         {
  73.                 /* Incomplete list                                        */
  74.                 free( s );
  75.                 return( 1 );
  76.         }
  77.         //可以打开filesearching.com搜索一个文件后,在结果界面中查看源代码,就能看到这个标签
  78.         //没发现</pre>就说明没结束,还有,没到搜索topN之前,继续走
  79.         /*
  80.         <pre class=list>
  81.         1 <img src=/img/icontxt.gif width=16 height=16> <b>    665</b> <a href=/cgi-bin/s?t=n&l=en&q=ftp.de.debian.org/ class=ls>ftp.de.debian.org</a><a href=/cgi-bin/s?t=n&l=en&q=ftp.de.debian.org/debian/dists/lenny/main/installer-amd64/20090123lenny8/images/netboot/debian-installer/amd64/boot-screens class=lg>/debian/dists/lenny/main/installer-amd64/20090123lenny8/images/netboot/debian-installer/amd64/boot-screens/</a><a href=ftp://ftp.de.debian.org/debian/dists/lenny/main/installer-amd64/20090123lenny8/images/netboot/debian-installer/amd64/boot-screens/f2.txt class=lf>f2.txt</a>
  82.         2 <img src=/img/icontxt.gif width=16 height=16> <b>    665</b> <a href=/cgi-bin/s?t=n&l=en&q=ftp.de.debian.org/ class=ls>ftp.de.debian.org</a><a href=/cgi-bin/s?t=n&l=en&q=ftp.de.debian.org/debian/dists/lenny/main/installer-amd64/20090123lenny8/images/netboot/gtk/debian-installer/amd64/boot-screens class=lg>/debian/dists/lenny/main/installer-amd64/20090123lenny8/images/netboot/gtk/debian-installer/amd64/boot-screens/</a><a href=ftp://ftp.de.debian.org/debian/dists/lenny/main/installer-amd64/20090123lenny8/images/netboot/gtk/debian-installer/amd64/boot-screens/f2.txt class=lf>f2.txt</a>
  83.         </pre>
  84.         */
  85.         //结束条件: 找到结束符号 or 查找条目数够了 or 读取的字符串无效 
  86.         for( i = 1; strncmp( s1, "</pre>", 6 ) && i < results->conf->search_amount && *s1; i ++ )
  87.         {
  88.                 s3 = strchr( s1, '\n' ); *s3 = 0;
  89.                 //最后一个href=..是文件URL
  90.                 //s2=ftp://ftp.de.debian.org/debian/dists/lenny/main/installer-amd64/20090123lenny8/images/netboot/debian-installer/amd64/boot-screens/f2.txt class=lf>f2.txt</a>
  91.                 s2 = strrstr( s1, "<a href=" ) + 8;
  92.                 
  93.                 *s3 = '\n';
  94.                 //找到URL后面的空格,改成结束符
  95.                 //s2变为:
  96. //ftp://ftp.de.debian.org/debian/dists/lenny/main/installer-amd64/20090123lenny8/images/netboot/debian-installer/amd64/boot-screens/f2.txt
  97. //一个完整的文件下载地址
  98.                 s3 = strchr( s2, ' ' ); *s3 = 0;
  99.                 if( strcmp( results[0].url, s2 ) )
  100.                 {
  101.                         
  102.                         strncpy( results[i].url, s2, MAX_STRING );
  103.                         results[i].size = results[0].size;
  104.                         results[i].conf = results->conf;
  105.                 }
  106.                 else
  107.                 {
  108.                         /* The original URL might show up                */
  109.                         i --;
  110.                 }
  111.                 //找到第一行结束回车符
  112.                 for( s1 = s3; *s1 != '\n'; s1 ++ );
  113.                 //第二行开头
  114.                 s1 ++;
  115.         }
  116.         
  117.         free( s );
  118.         //返回查找到的个数
  119.         return( i );
  120. }
复制代码

 

你可能感兴趣的:(axel搜索镜像文件)