• 【转】larbin主要代码说明


    转自:http://blog.csdn.net/s030702614/article/details/5683928

    1. 主函数:

    int main (int argc, char *argv[])  {
           global glob(argc,argv)    //初始化变量、队列
           StartThread(startWebserver,NULL)      //web服务
           cron()     //配置初始化
           for( ; ;)  {
                  waitBandWidth(&old);   //等待带宽
                  poll(NULL,0,10);    //间隔10ms
                  cron();
                  input();    //接受数据,装载url(貌似都没有执行过)
                  sequencer();   //url队列调度
                  fetchDns();     //解析DNSSites中的dns
                  fetchOpen();   //爬取网页
                  CheckAll();     //读取数据
                  poll();      //间隔10ms
            }
    }
    

    2. void sequencer ();

    函数功能:按优先级顺序将url加入到namedSiteList

    参数说明:void

    返回值:队列中有url返回true,否则返回false

    bool sequencer(void)  {
           space=putAll();      //能够装载的urls数
           CanGetUrl(& testPriority);  {      //获得一个url,放到namedsitelist中去
                  if(URLPriorityWait中有url)
                         从中获得url加入到namedSiteList;
                  else if(URLPtiority中有url)
                         从中获得url加入到namedSiteList;
                  else  {
                         if(URLDiskwait中有url)
                                从中获得url加入到namedSiteList;
                         else  //URLDisk中有url
                                从中获得url加入到namedSiteList;
                  }
           }
    }
    

    3. void fetchDns;

    函数功能:建立socket,进行dns解析

    参数说明:void

    返回值:void

    void fetchDns ()  {
           while(等待解析的dns数<dns最大并行连接数&&有空闲连接&&IPUrl < maxIPUrls)  {
                  从dnsSites获得一个url;
                  site->newQuery();//dns查询
            }
    
           while (有dns等待解析&&有空闲连接)  {// Read available answers
                adns_check(global::ads, &quer, &ans, (void**)&site);
                site->dnsAns(ans); // dns解析成功,申明连接空闲
           }
    }
    
     
    4. void fetchOpen ();

    函数功能:建立sockets连接(仅仅对于已经经过dns解析的站点)

    参数说明:void

    返回值:void

    备注:工作在主线程

    void fetchOpen () {
      while (okSites中还有url &&有空闲的连接) {
          从okSites-中获得一个url;
          /** s->fetch() means :
             * fetch the first page in the fifo okSites
             * there must be at least one element in freeConns !!!
             * return expected time for next call (0 means now is OK)
             * This function always put the IPSite in fifo before returning
             *   (or set isInFifo to false if empty)
             */
          next_call = s->fetch();//调用fetch()
      }
    }
    

    5. void checkAll ()

    函数功能:1、read all data available   2、fill fd_set for next select  3、give back max fds

    参数说明:void

    返回值:void

    void checkAll ()  {
        for (uint i=0; i<global::nb_conn; i++) {//nb_conn为并行的连接数,对于每个连接
            switch(连接状态)  {
                case connectingC:
                case writeC:
                /*如果是要连接,调用getsockopt,再把状态改为writeC。如果是writeC,调用write,将状态改为openC。*/
                    pipeWrite(conn);
                    break;
                case openC:
                    pipeRead(conn);
                    break;
            }
        }
    
    // update fd_set for the next select
    /*对要将读写设为非堵塞的设置*/
        for (uint i=0; i<global::nb_conn; i++) {
            int n = (global::connexions+i)->socket;
            switch ((global::connexions+i)->state) {
                case connectingC:
                case writeC:
                    global::setPoll(n, POLLOUT);
                    break;
                case openC:
                    global::setPoll(n, POLLIN);
                    break;
            }
        }
    }        
    
  • 相关阅读:
    leetcode 763. Partition Labels
    JS字符串格式化~欢迎来搂~~
    手把手教你在pycharm上上传项目至GitHub
    手把手教你用原始方式上传项目至GitHub
    python3.7环境下创建app、运行Django1.11版本项目报错Generator expression must be parenthesized
    在学习python的DjangoFlaskTornado前你需要知道的,what is web?
    python手撸桌面计算器
    jQuery之克隆事件--clone()与clone(true)区别
    前端之jQuery基础
    通过案例来剖析JQuery与原生JS
  • 原文地址:https://www.cnblogs.com/sunada2005/p/3196043.html
Copyright © 2020-2023  润新知