Пример #1
0
/******************************************************************************
 **函数名称: 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;
}
Пример #2
0
/******************************************************************************
 **函数名称: 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;
}
Пример #3
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;
}
Пример #4
0
/******************************************************************************
 **函数名称: 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;
}