コード例 #1
0
ファイル: sf_proto.c プロジェクト: ebisawa/lmq
int
sf_proto_msglen(sf_instance_t *inst, sf_session_t *session, sf_pbuf_t *pbuf)
{
    int len;
    sf_protocb_t *pcb = PCB(session);

    if ((len = sf_pbuf_data_len(pbuf)) <= 0)
        return -1;
    if ((pcb = PCB(session)) == NULL || pcb->pc_msg_length == NULL)
        return len;

    return pcb->pc_msg_length(&session->se_sf, sf_pbuf_head(pbuf), len, UDATA(session));
}
コード例 #2
0
ファイル: conn.c プロジェクト: houweifeng/sbase
/* chunk data  handler */
int conn_data_handler(CONN *conn)
{
    int ret = -1;
    CONN_CHECK_RET(conn, ret);

    if(conn)
    {
        if(conn && conn->session.data_handler)
        {
            ret = conn->session.data_handler(conn, PCB(conn->packet), 
                    PCB(conn->cache), PCB(conn->chunk));
        }
    }
    return ret;
}
コード例 #3
0
ファイル: sf_proto.c プロジェクト: ebisawa/lmq
int
sf_proto_end(sf_instance_t *inst, sf_session_t *session)
{
    sf_protocb_t *pcb = PCB(session);

    if (pcb == NULL || pcb->pc_session_end == NULL)
        return 0;

    return pcb->pc_session_end(&session->se_sf, UDATA(session));
}
コード例 #4
0
ファイル: sf_proto.c プロジェクト: ebisawa/lmq
int
sf_proto_input(sf_instance_t *inst, sf_session_t *session, sf_pbuf_t *pbuf, int msglen)
{
    sf_protocb_t *pcb = PCB(session);

    if (pcb == NULL || pcb->pc_msg_input == NULL)
        return -1;

    return pcb->pc_msg_input(&session->se_sf, sf_pbuf_head(pbuf), msglen, UDATA(session));
}
コード例 #5
0
ファイル: conn.c プロジェクト: houweifeng/sbase
/* packet handler */
int conn_packet_handler(CONN *conn)
{
    int ret = -1;
    CONN_CHECK_RET(conn, ret);

    if(conn && conn->session.packet_handler)
    {
        ret = conn->session.packet_handler(conn, PCB(conn->packet));
    }
    return ret;
}
コード例 #6
0
ファイル: conn.c プロジェクト: houweifeng/sbase
/* terminate connection */
int conn_terminate(CONN *conn)
{
    int ret = -1;

    if(conn)
    {
        if(conn->c_state == C_STATE_USING && conn->session.error_handler)
        {
            DEBUG_LOGGER(conn->logger, "error handler session[%s:%d] via %d cid:%d", 
                    conn->ip, conn->port, conn->fd, conn->c_id);
            conn->session.error_handler(conn, PCB(conn->packet), PCB(conn->cache), PCB(conn->chunk));
        }
        conn->event->destroy(conn->event);
        DEBUG_LOGGER(conn->logger, "terminateing session[%s:%d] via %d",
                conn->ip, conn->port, conn->fd);
        shutdown(conn->fd, SHUT_RDWR);
        close(conn->fd);
        conn->fd = -1;
        ret = 0;
    }
    return ret;
}
コード例 #7
0
ファイル: conn.c プロジェクト: houweifeng/sbase
/* oob data handler */
int conn_oob_handler(CONN *conn)
{
    int ret = -1;
    CONN_CHECK_RET(conn, ret);

    if(conn)
    {
        if(conn && conn->session.oob_handler)
        {
            ret = conn->session.oob_handler(conn, PCB(conn->oob));
        }

    }
    return ret;
}
コード例 #8
0
ファイル: conn.c プロジェクト: houweifeng/sbase
/* packet reader */
int conn_packet_reader(CONN *conn)
{
    int len = -1, i = 0;
    CB_DATA *data = NULL;
    char *p = NULL, *e = NULL;
    int packet_type = 0;

    CONN_CHECK_RET(conn, -1);

    if(conn)
    {
        data = PCB(conn->buffer);
        packet_type = conn->session.packet_type;
        DEBUG_LOGGER(conn->logger, "Reading packet type[%d]", packet_type);
        /* Remove invalid packet type */
        if(!(packet_type & PACKET_ALL))
        {
            FATAL_LOGGER(conn->logger, "Unkown packet_type[%d] on %s:%d via %d",
                    packet_type, conn->ip, conn->port, conn->fd);
            /* Terminate connection */
            CONN_TERMINATE(conn);
        }
        /* Read packet with customized function from user */
        if(packet_type == PACKET_CUSTOMIZED && conn->session.packet_reader)
        {
            len = conn->session.packet_reader(conn, data);
            DEBUG_LOGGER(conn->logger,
                    "Reading packet with customized function[%08x] length[%d] on %s:%d via %d",
                    conn->session.packet_reader, len, conn->ip, conn->port, conn->fd);
            goto end;
        }
        /* Read packet with certain length */
        else if(packet_type == PACKET_CERTAIN_LENGTH
                && MB_NDATA(conn->buffer) >= conn->session.packet_length)
        {
            len = conn->session.packet_length;
            DEBUG_LOGGER(conn->logger, "Reading packet with certain length[%d] on %s:%d via %d",
                    len, conn->ip, conn->port, conn->fd);
            goto end;
        }
        /* Read packet with delimiter */
        else if(packet_type == PACKET_DELIMITER && conn->session.packet_delimiter
                && conn->session.packet_delimiter_length > 0)
        {
            p = MB_DATA(conn->buffer);
            e = MB_END(conn->buffer);
            i = 0;
            while(p < e && i < conn->session.packet_delimiter_length )
            {
                if(((char *)conn->session.packet_delimiter)[i++] != *p++) i = 0;
                if(i == conn->session.packet_delimiter_length)
                {
                    len = p - MB_DATA(conn->buffer);
                    break;
                }
            }
            DEBUG_LOGGER(conn->logger, "Reading packet with delimiter[%d] "
                    "length[%d] on %s:%d via %d", conn->session.packet_delimiter_length, 
                    len, conn->ip, conn->port, conn->fd);
            goto end;
        }
        return len;
end:
        /* Copy data to packet from buffer */
        if(len > 0)
        {
            MB_RESET(conn->packet);
            MB_PUSH(conn->packet, MB_DATA(conn->buffer), len);
            MB_DEL(conn->buffer, len);
            /* For packet handling */
            conn->s_state = S_STATE_PACKET_HANDLING;
            conn->push_message(conn, MESSAGE_PACKET);
        }
    }
    return len;
}