⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 core.c

📁 a meta serach engine
💻 C
📖 第 1 页 / 共 2 页
字号:
			break;		case 2:			n = rpp * (page - 1);			break;		case 3:			n = (rpp * (page - 1)) + 1;			break;	}	return itoa(n);}// ----------------------------------------------------------------------------// createHTTPRequest ----------------------------------------------------------// This  function make the HTTP REQUEST using the given parameters. Then return// a pointer to it.// ----------------------------------------------------------------------------void createHTTPRequest(struct engineWork *e) {	char *t1, *t2, *t3, *npage, *rpp;																		// temporary buffers	extern char *query;		npage = enginePageCalc(e->info->npc, e->rpp, e->startpage);										// calculate page number	rpp = itoa(e->rpp);																							// convert page number into integer	t1 = strrpl(e->info->query, "%QUERYSTR", query);													// replace the query string	t2 = strrpl(t1, "%RESULTS", rpp);																		// replace the desidered result number	t3 = strrpl(t2, "%PAGE", npage);																			// replace the desidered page number		clearOutputBuffer(e);																						// clear the output buffer	strcpy(e->ob, t3);																							// put maked HTTP REQUEST into buffer	if (config.verbose) printf("HTTP REQUEST: socket=%d, engine=%s\n%s",e->socket, e->info->host, t3);		free(t1); free(t2); free(t3); free(npage); free(rpp);}// ----------------------------------------------------------------------------// bufferFreeMemory -----------------------------------------------------------// Calculate free memory left in the engine's input-buffer// ----------------------------------------------------------------------------int bufferFreeMemory(struct engineWork *e) {	return (e->ib + ibsize) - e->ib_free;}// ----------------------------------------------------------------------------// tx -------------------------------------------------------------------------// If  there  still  is  something to send in the output-buffer, send it, else,// prepare to receive data// ----------------------------------------------------------------------------int tx(struct engineWork *e) {	short k=strlen(e->ob_next);	bench(0);	if (e->ob_next[0]!='\0') {																					// if there is something ready to send		k=write(e->socket, e->ob_next, k);																	// try to send it on the socket				if (k==-1) return engineError(e, "write");														// if error in WRITE, report and stop				e->ob_next += k;																							// move ptr according to how much sent		stats.tx_bytes += k;																						// increment sent bytes counter		} else {		clearInputBuffer(e);																						// prepare INPUT buffer to receive data		clearParserInformations(e);																			// reset the parse script controller		setReadInterest(e);																						// set READING interest	}		if (config.verbose) printf("TX: socket=%d, write=%d\n", e->socket, k);	stats.tx_time += bench(0);	return 1;}// ----------------------------------------------------------------------------// requestNewPage -------------------------------------------------------------// Close current TCP connection with the server, increase the page counter, and// ask for the new page, opening a new connection with the server.// ----------------------------------------------------------------------------int requestNewPage(struct engineWork *e) {	short k = e->socket;	e->startpage++;																								// choose new page	e->socket = createTCPSocket();																			// create new socket	if (e->socket==-1) return engineError(e, "createTCPSocket");									// if error, report it and stop engine		engineConnect(e);																								// connect the engine to web server	createHTTPRequest(e);																						// create new request in output buffer	clearFoundCounter(e);																						// clear FOUND counter	setWriteInterest(e);																							// set WRITING interest		if (config.socket_trace) printf("SK: engine=%s, old_socket=%d, new_socket=%d\n",e->info->name, k, e->socket);	return 1;}// ----------------------------------------------------------------------------// rx -------------------------------------------------------------------------// Receive  as  much  data  is  possible  from  the  server and store it in the// engine's input-buffer// ----------------------------------------------------------------------------int rx(struct engineWork *e) {	int k=0;	int free = bufferFreeMemory(e);	bench(0);	k = read(e->socket, e->ib_free, free);																	// read as much data is possible		if (k==-1) return engineError(e, "read");																// if error in READ, report it and stop		stats.rx_bytes += k;																							// increment the receive bytes counter	if (config.dump_to_disk) dumpToDisk(e);																// if requested, dump to disk	e->ib_free += k;																								// move the FREE-pointer forward	if (k==0) {																										// if READ returned 0, data finished		socketClose(e->socket);																					// close the engine's socket		if (config.socket_trace) printf("SK: engine=%s, closing_socket=%d\n", e->info->name, e->socket);						if (e->startpage < e->endpage)																		// if it's not last page, ask next			requestNewPage(e);		else			setNoInterest(e);																						// if it's the last page, stop reading	}			if (config.verbose) printf("RX: socket=%d, free=%d, read=%d\n", e->socket, free, k);				e->rxTime += bench(0);																						// save the RX time for engine	return k;}// ----------------------------------------------------------------------------// decreaseRetry --------------------------------------------------------------// Scroll  all working-engine's structures and decrease the retry counter after// a SELECT timeout// ----------------------------------------------------------------------------void decreaseRetry (struct engineWork e[], short n) {	short i;	for (i=0; i<n; i++) {		if (e[i].readretry>0) e[i].readretry--;		if (e[i].writeretry>0) e[i].writeretry--;	}}// ----------------------------------------------------------------------------// setSocketSet ---------------------------------------------------------------// After  clearing  the  FD_SET structures, set their bits checking the engines// retry counters.// ----------------------------------------------------------------------------void setSocketSet(struct engineWork e[], short n, fd_set *rset, fd_set *wset) {	short i;		FD_ZERO(rset); FD_ZERO(wset);	for (i=0; i<n; i++) {		if (e[i].readretry>0) {			FD_SET(e[i].socket, rset);			continue;		}		if (e[i].writeretry>0) {			FD_SET(e[i].socket, wset);			continue;		}	}}// ----------------------------------------------------------------------------// setTimeout -----------------------------------------------------------------// Set the TIMEVAL structure to the specified timeout value// ----------------------------------------------------------------------------void setTimeout(short ms, struct timeval *t) {	t->tv_sec = ms / 1000;	t->tv_usec = ms % 1000;}// ----------------------------------------------------------------------------// maxEngineSocket ------------------------------------------------------------// Find maximum socket value in the given engineWork array// ----------------------------------------------------------------------------short maxEngineSocket(struct engineWork e[], short n) {	short i, max=0;	for (i=0; i<n; i++)		if (max<e[i].socket) max=e[i].socket;	return max;}// ----------------------------------------------------------------------------// stillAny -------------------------------------------------------------------// Return TRUE if there is at least one engine still at work// ----------------------------------------------------------------------------char stillAny(struct engineWork e[], short n) {	short i;		for (i=0; i<n; i++)		if (e[i].readretry>0 || e[i].writeretry>0) return 1;	return 0;}// ----------------------------------------------------------------------------// engineSetup ----------------------------------------------------------------// Fill  the  engine  work structure with parameter's data, or with the default// engine preferences if no data were given// ----------------------------------------------------------------------------void engineSetup(char *arg, struct engineWork *e) {	char *name, *results, *pages, *startpage;	name			= strsep2(&arg, '=');																		// look for '=' to grab the name	results		= strsep2(&arg, ',');																		// look for ',' to grab results4page	pages 		= strsep2(&arg, ',');																		// look for ',' to grab pages number	startpage	= arg;																							// last num, if exist, is start-page	e->info = ptrToEngineInformations(name);																// set the pointer to engine infos		if (results!=NULL)	e->rpp = atoi(results);															// if results4page specified, use it		else					e->rpp = e->info->rpp;															// if not specified, use default		if (startpage!=NULL)	e->startpage = atoi(startpage);												// if start page specified, use it		else					e->startpage = 1;																	// if not specified, start from first		if (pages!=NULL)		e->endpage = atoi(pages) + e->startpage - 1;								// if number of pages specified, use		else					e->endpage = e->info->pag + e->startpage - 1;							// if not specified, use default		e->requested = e->rpp * (e->endpage - e->startpage + 1);											// calc number of requested results	stats.req_result += e->requested;																		// calc total requested results	e->entry.rank = ((e->startpage-1)*e->rpp) + 1;														// calculate first entry rank		createHTTPRequest(e);}// ----------------------------------------------------------------------------// engineConnect --------------------------------------------------------------// Connect the engine with it's socket, using default engine informations// ----------------------------------------------------------------------------int engineConnect(struct engineWork *e) {	return socketConnect(e->socket, e->info->sa);}// ----------------------------------------------------------------------------// printEngineInfo ------------------------------------------------------------// Print to screen the avaiable engine's informations// ----------------------------------------------------------------------------void printEngineInfo(short i, struct engineWork e, fd_set rset, fd_set wset) {	printf("\n");	printf("=== Engine %d ===\n",i);	printf("host\t\t: %s\n",e.info->host);	printf("port\t\t: %d\n",e.info->port);	printf("rpp\t\t: %d\n", e.rpp);	printf("startpage\t: %d\n",e.startpage);	printf("endpage\t\t: %d\n",e.endpage);	printf("readretry\t: %d\n",e.readretry);	printf("writeretry\t: %d\n",e.writeretry);	printf("socket\t\t: %d\n",e.socket);	printf("wset\t\t: %d\n",FD_ISSET(e.socket, &wset));	printf("rset\t\t: %d\n",FD_ISSET(e.socket, &rset));}// ----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -