/****************************************************************************** **函数名称: invtd_search_parse **功 能: 解析搜索请求 **输入参数: ** ctx: 全局对象 ** buff: 搜索请求(报头+报体) ** len: 数据长度 **输出参数: ** req: 搜索请求 **返 回: 0:成功 !0:失败 **实现描述: **注意事项: **作 者: # Qifeng.zou # 2015.12.27 03:39:00 # ******************************************************************************/ static int invtd_search_parse(invtd_cntx_t *ctx, char *buf, size_t len, mesg_search_req_t *req) { xml_opt_t opt; xml_tree_t *xml; xml_node_t *node; mesg_header_t *head = (mesg_header_t *)buf; const char *xml_str = (const char *)(head + 1); /* > 字节序转换 */ MESG_HEAD_NTOH(head, head); /* > 校验合法性 */ if (!MESG_CHKSUM_ISVALID(head) || (len != MESG_TOTAL_LEN(head->length))) { log_error(ctx->log, "sid:%lu serial:%lu type:%u flag:%u chksum:0x%X len:%d body:%s", head->sid, head->serial, head->type, head->flag, head->chksum, head->length, xml_str); return -1; } log_trace(ctx->log, "sid:%lu serial:%lu type:%u flag:%u chksum:0x%X len:%d body:%s", head->sid, head->serial, head->type, head->flag, head->chksum, head->length, xml_str); /* > 构建XML树 */ memset(&opt, 0, sizeof(opt)); opt.log = ctx->log; opt.pool = NULL; opt.alloc = mem_alloc; opt.dealloc = mem_dealloc; xml = xml_screat(xml_str, head->length, &opt); if (NULL == xml) { log_error(ctx->log, "Parse xml failed!"); return -1; } do { /* > 提取搜索关键字 */ node = xml_query(xml, ".SEARCH.WORDS"); if (NULL == node) { log_error(ctx->log, "Get search words failed!"); break; } snprintf(req->words, sizeof(req->words), "%s", node->value.str); log_trace(ctx->log, "words:%s", req->words); /* > 释放内存空间 */ xml_destroy(xml); return 0; } while (0); xml_destroy(xml); return -1; }
/****************************************************************************** **函数名称: invtd_search_word_parse **功 能: 解析搜索请求 **输入参数: ** ctx: 全局对象 ** buff: 搜索请求(报头+报体) ** len: 数据长度 **输出参数: ** req: 搜索请求 **返 回: 0:成功 !0:失败 **实现描述: **注意事项: **作 者: # Qifeng.zou # 2015.12.27 03:39:00 # ******************************************************************************/ static int invtd_search_word_parse(invtd_cntx_t *ctx, char *buf, size_t len, mesg_search_word_req_t *req) { xml_opt_t opt; xml_tree_t *xml; xml_node_t *node; agent_header_t *head = (agent_header_t *)buf; const char *xml_str = (const char *)(head + 1); memset(&opt, 0, sizeof(opt)); /* > 字节序转换 */ head->type = ntohl(head->type); head->flag = ntohl(head->flag); head->length = ntohl(head->length); head->mark = ntohl(head->mark); head->serial = ntoh64(head->serial); req->serial = head->serial; log_trace(ctx->log, "serial:%lu type:%u flag:%u mark:0X%x len:%d body:%s", head->serial, head->type, head->flag, head->mark, head->length, xml_str); /* > 构建XML树 */ opt.pool = NULL; opt.alloc = mem_alloc; opt.dealloc = mem_dealloc; xml = xml_screat(xml_str, head->length, &opt); if (NULL == xml) { log_error(ctx->log, "Parse xml failed!"); return -1; } /* > 解析XML树 */ node = xml_query(xml, ".SEARCH.WORDS"); if (NULL == node) { log_error(ctx->log, "Get search words failed!"); } else { snprintf(req->words, sizeof(req->words), "%s", node->value.str); } xml_destroy(xml); log_trace(ctx->log, "words:%s", req->words); return 0; }
/****************************************************************************** **函数名称: xml_creat **功 能: 将XML文件转化成XML树 **输入参数: ** fname: 文件路径 ** opt: 选项信息 **输出参数: **返 回: XML树 **实现描述: ** 1. 将XML文件读入内存 ** 2. 在内存中将XML文件转为XML树 **注意事项: **作 者: # Qifeng.zou # 2013.02.05 # ******************************************************************************/ xml_tree_t *xml_creat(const char *fname, xml_opt_t *opt) { char *buff; xml_tree_t *xml; /* 1. 将XML文件读入内存 */ buff = xml_fload(fname, opt); if (NULL == buff) { log_error(opt->log, "Load xml file into memory failed![%s]", fname); return NULL; } /* 2. 在内存中将XML文件转为XML树 */ xml = xml_screat(buff, -1, opt); opt->dealloc(opt->pool, buff); return xml; }
/****************************************************************************** **函数名称: mon_srch_recv_rsp **功 能: 接收搜索应答信息 **输入参数: ** fd: 文件描述符 **输出参数: NONE **返 回: 0:成功 !0:失败 **实现描述: **注意事项: **作 者: # Qifeng.zou # 2015.06.05 17:01:04 # ******************************************************************************/ static int mon_srch_recv_rsp(mon_cntx_t *ctx, mon_srch_conn_t *conn) { int idx; ssize_t n; char addr[8192]; serial_t serial; xml_opt_t opt; xml_tree_t *xml; xml_node_t *node, *attr; struct timeval ctm; int sec, msec, usec; agent_header_t head; mesg_data_t *rsp; memset(addr, 0, sizeof(addr)); /* > 接收应答数据 */ n = read(conn->fd, (void *)&head, sizeof(head)); gettimeofday(&ctm, NULL); if (n <= 0) { fprintf(stderr, " errmsg:[%d] %s!\n", errno, strerror(errno)); return -1; } else if (0 == conn->wrtm.tv_sec) { fprintf(stderr, " Didn't send search request but received response!\n"); } /* > 字节序转换 */ head.type = ntohl(head.type); head.flag = ntohl(head.flag); head.length = ntohl(head.length); head.mark = ntohl(head.mark); head.serial = ntoh64(head.serial); n = read(conn->fd, addr, head.length); /* > 显示查询结果 */ fprintf(stderr, " ============================================\n"); rsp = (mesg_data_t *)addr; rsp->serial = ntoh64(rsp->serial); serial.serial = head.serial; fprintf(stderr, " >Serial: %lu [nid(%u) sid(%u) seq(%u)]\n", head.serial, serial.nid, serial.sid, serial.seq); fprintf(stderr, " >Serial: %lu:%lu\n", rsp->serial, head.serial); memset(&opt, 0, sizeof(opt)); opt.pool = NULL; opt.alloc = mem_alloc; opt.dealloc = mem_dealloc; xml = xml_screat(rsp->body, head.length, &opt); if (NULL == xml) { fprintf(stderr, " Format isn't right! body:%s\n", rsp->body); return -1; } node = xml_query(xml, ".SEARCH-RSP.ITEM"); for (idx=1; NULL != node; node = xml_brother(node), ++idx) { attr = xml_search(xml, node, "URL"); fprintf(stderr, " [%02d] URL:%s", idx, attr->value.str); attr = xml_search(xml, node, "FREQ"); fprintf(stderr, " FREQ:%s\n", attr->value.str); } xml_destroy(xml); /* > 打印统计信息 */ sec = ctm.tv_sec - conn->wrtm.tv_sec; msec = (ctm.tv_usec - conn->wrtm.tv_usec)/1000; if (msec < 0) { sec -= 1; msec += 1000; } usec = (ctm.tv_usec - conn->wrtm.tv_usec)%1000; if (usec < 0) { usec += 1000; msec -= 1; if (msec < 0) { sec -= 1; msec += 1000; } } if (msec < 0) { msec += 1000; sec -= 1; } fprintf(stderr, " >Spend: %d(s).%03d(ms).%03d(us)\n", sec, msec, usec); fprintf(stderr, " ============================================\n"); return 0; }