【转】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; } } }