1 Star 1 Fork 0

hotmocha/spider

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
worker.h 6.19 KB
一键复制 编辑 原始数据 按行查看 历史
hotmocha 提交于 2015-04-02 22:29 . spider init
/*
* MODULE NAME :
* PROGRAM NAME : worker.h
* AUTHOR : HOTMOCHA
* CREATE DATE : 2015-01-13 18:45:20
* PROGRAM DESC :
*
* HISTORY :
*
*/
#ifndef _H_WORKER_H_
#define _H_WORKER_H_
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curl/curl.h>
#include <string.h>
#include "ilog.h"
#include "simplebuf.h"
#include "list.h"
#include "queue.h"
#include "type.h"
#define SPIDER_INTERNAL_ERR -10001
#define SPIDER_ARG_ERR -10002
#define SPIDER_MEM_ERR -10003
#define SPIDER_FILE_ERR -10004
#define SPIDER_NOTFOUND_ERR -10005
#define SPIDER_TOOMANYTASK_ERR -10006
#define SPIDER_HTMLPARSE_ERR -10007
#define SPIDER_JSONPARSE_ERR -10008
#define SPIDER_INVALID -10009
/* worker线程状态 */
#define WORKER_STATUS_UNUSED 0
#define WORKER_STATUS_USED 1
#define WORKER_STATUS_NEEDREINIT 2
#define WORKER_STATUS_RUNNINGERR 3
#define WORKER_STATUS_EXIT 4
#define WORKER_STATUS_COMPLETETASK 5
#define WORKER_DEFAULT_TIMEOUT 120 /* 默认2分钟没有反应算超时 */
#define WORKER_DEFAULT_MAXCONNEXTS 20 /* 默认最大的连接数为20 */
/* 对于一个HttpReq请求,错误码返回通过两个int(result, errno) */
#define SPIDER_OK 0
#define SPIDER_TRANSFERERR -1 /* 具体的html响应码存放在rerrno */
#define SPIDER_CHECKRESPERROR -2 /* 调用挂接的checkresp函数出错, 具体错误码放在rerrno中 */
#define SPIDER_PARSERHEADERERROR -3 /* 细分了解析阶段的错误 */
#define SPIDER_PARSERHBODYERROR -4
//#define SPIDER_PARSERERROR -2 /* 解析过程出错,具体的错误码放在rerrno中 */
#define SPIDER_AFTERPROCESSERROR -5 /* 调用挂接的afterParse函数出错, 具体错误码放在rerrno中*/
#define SPIDER_DONEBUTRESULTERROR -6 /* 结果为CURLMSG_DONE但是result不为0, result错误码放在rerrno中*/
#define SPIDER_NOTDONE -7 /* 结果不为CURLMSG_DONE, 将msg放入rerrno中 */
#define SPIDER_MAKEHTTPREQERROR -8 /* 调用makereq函数出错, 具体错误码放入rerrno中 */
#define SPIDER_FINISHERROR -9 /* 调用finish函数出错, 具体错误码放入rerrno中 */
#define MAXERRMSGLEN 101
struct WorkerEnv;
struct HttpReq;
typedef int (*HttpReqFuncProc)(struct HttpReq*);
typedef int (*WorkerFuncProc)(struct WorkerEnv*);
typedef int (*GenerateHttpReq)(struct HttpReq**);
struct HttpReq {
char reqname[51];
struct curl_slist *headerlist;
CURL *curl;
void *inputdata; /* 保存输入,自定义的结构体*/
void (*FreeInputData)(void*); /* 如果是简单的类型或者静态变量局部变量全局变量,free函数必须传入null */
void *outputdata;
void (*FreeOutputData)(void*);
Buf *recvheader;
Buf *recvbody;
/* 存放结果码 */
int result; /* 阶段性错误码表示某个阶段错误 */
int rerrno; /* 详细错误码 */
char errmsg[CURL_ERROR_SIZE];
int trytimes;
void *data; /* 备用 */
};
struct HttpReq* InitHttpReq();
void FreeHttpReq();
/* 静态初始化worker使用的结构体 */
struct WorkerInitStruct {
char workername[101];
int timeout;
int delaytime; /* ms */
int maxcocurrent;
char logfilename[51];
WorkerFuncProc initWorkerFunc; /* 8个回调函数 */
GenerateHttpReq makeReqFunc;
HttpReqFuncProc checkRespValid;
HttpReqFuncProc parseRespHeader;
HttpReqFuncProc parseRespBody;
HttpReqFuncProc afterParse; /* 不管有没有解析都会调用本函数 */
WorkerFuncProc finishWorkerFunc; /* !初始化过程出错不会调用到本函数 */
HttpReqFuncProc finishHttpReqFunc; /* 退出前正在请求和在请求队列中的进行处理 */
};
/* TODO 考虑类似login页面,只有周期性的调用就可以了,没有输入 */
struct WorkerEnv
{
struct TaskEnv* workermanager;
pthread_t tid; /* unsigned long */
int cmd;
char workername[101];
CURLM *curlm;
char logfilename[51];
int cycletime; /* ms为单位 */
int tasktype; /* 简单周期性任务 复杂任务 */
int timeout; /* s为单位,必须小于这个时间间隔向主线程汇报活状态 */
int delaytime; /* ms */
/* 定期修改时间表示存活 */
time_t lasttime;
/* 放入struct HttpReq*,等待队列 */
Queue *req_queue;
/* 正在处理的struct HttpReq, 大小根据并发数固定初始化 */
struct HttpReq* *processingreq;
int httpreqnum; /* 正在运行的请求 */
/* 状态值 */
int status; /* 如果完成任务自己退出,会设置完成的标志 */
/* 检查接收的网页时候正常 */
HttpReqFuncProc checkRespValid;
/* 处理header和body的函数 */
HttpReqFuncProc parseRespHeader;
HttpReqFuncProc parseRespBody;
HttpReqFuncProc afterParse;
/* 产生httpreq放入到队列中 */
GenerateHttpReq makeHttpReq;
/* 整个任务开始前调用*/
WorkerFuncProc initWorkerFunc;
/* 整个任务结束后调用*/
WorkerFuncProc finishWorkerFunc;
/* 超时情况下在clean被调用 */
HttpReqFuncProc finishHttpReqFunc;
int totaltrytimes; /* 有默认值 */
int maxtrytimes;
long completetimes ;
long uncompletetimes ;
char certfile[256];
int maxcocurrent;
int verbose;
};
int InitWorkerWithInitStruct(struct WorkerEnv *wenv, struct WorkerInitStruct* initstruct);
struct WorkerEnv* InitWorkerEnv(struct TaskEnv* tenv);
void FreeWorkerEnv(struct WorkerEnv *env);
int InitCurl(CURL *eh, struct HttpReq *req );
void* WorkerMain(void *arg);
int WaitForAllWorkerInited(struct TaskEnv *tenv);
void SetHttpReqInputData(struct HttpReq *req, void *inputdata, void (*freeFunc)(void *));
void* GetHttpReqInputData(struct HttpReq *req);
void SetHttpReqOutputData(struct HttpReq *req, void *outputdata, void (*freeFunc)(void *));
void* GetHttpReqOutputData(struct HttpReq *req);
void SetTaskName(struct WorkerEnv* env, char *strTaskName);
int SetHeader(struct HttpReq *req, char *header);
int SetCookieFromFile(struct HttpReq *req, char *file);
int SetCookie(struct HttpReq *req, char *cookie);
int SetPostdata(struct HttpReq *req, char *postdata);
int SetUrl(struct HttpReq *req, char *url);
void SetVerbose(struct WorkerEnv *env, int e);
int PrintRespHeader(struct HttpReq *req);
int PrintRespBody(struct HttpReq *req);
int SetCertFile(struct TaskEnv *tenv, struct HttpReq *req, char *filename);
void SetInitFunc(struct WorkerEnv *wenv, WorkerFuncProc func);
void SetFinishFunc(struct WorkerEnv *wenv, WorkerFuncProc func);
void SetParseHeader(struct WorkerEnv *wenv, HttpReqFuncProc func);
void SetParseBody(struct WorkerEnv *wenv, HttpReqFuncProc func);
void ModifyDelaytime(struct WorkerEnv *wenv, int diffms);
int GetTryTimes(struct HttpReq* req);
void AddTryTimes(struct HttpReq *req);
const char* GetStageErrorInfo(struct HttpReq *req);
int GetStageErrorNo(struct HttpReq *req);
int GetDetailErrorNo(struct HttpReq *req);
#endif
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/hotmocha/spider.git
git@gitee.com:hotmocha/spider.git
hotmocha
spider
spider
master

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385