Пример #1
0
void* TcpServer::RecvParse(void* pData)
{
    TcpServer* pthis = NULL;
    mio2_t m = NULL;
    LPMESSAGE_DATA pMsg = NULL;
    int iLen = 0;

    if (pData) {
        m = ((c2s_t)pData)->mio2;
        pthis = (TcpServer*)(((c2s_t)pData)->pvoid);
    }
    if (!pthis || !m) {
        gvLog(LOG_ERR_SYS, "(TcpServer::RecvParse) receive pool start fail by error param");
        return NULL;
    }

    RecvParser* pRecvParser = new RecvParser();
    if (!pRecvParser) return NULL;

    LPMESSAGE_DATA pErrMsgData = NULL;
    while (pthis->IsRunning()) {
        pMsg = g_MsgListRecv->Get_Msg();
        if (pMsg) {
            gvLog(LOG_MSG, "(TcpServer::RecvParse) entering receive parser... iFd:%d", pMsg->iFd);
            iLen = pRecvParser->ParserData(pMsg);
            gvLog(LOG_MSG, "(TcpServer::RecvParse) MSG: iLen:%d iFd:%d", iLen, pMsg->iFd);
            if (iLen > 0) {
                //put into data parser
                pthis->AddConnect();

                pMsg = MatchPacketHandler::GetInstance()->Handling(pMsg, pErrMsgData);
                if (NULL != pMsg){
                    g_MsgListData->Put_Msg(pMsg);
                }
                else if (NULL != pErrMsgData){
                    pErrMsgData->bSendAndClose = true;
                    g_MsgListSnd->Put_Msg(pErrMsgData);
                }
                else {
                    if (NULL != pMsg) {
                        gvLog(LOG_MSG, "(TcpServer::RecvParse) MSG: MatchPacketHandler() iFd:%d", pMsg->iFd);
                    }
                }
            } else {
                if (iLen == 0) {
                    //maybe (errno == EWOULDBLOCK || errno == EINTR || errno == EAGAIN)
                    gvLog(LOG_MSG, "(TcpServer::RecvParse) (iLen == 0) iFd:%d", pMsg->iFd);
                } else {
                    gvLog(LOG_MSG, "(TcpServer::RecvParse) mio2_close iFd:%d", pMsg->iFd);
                    mio2_close(m, pMsg->iFd);
                }
                gvLog(LOG_MSG, "(TcpServer::RecvParse) MSG: fail iFd:%d pMsg:%p", pMsg->iFd, pMsg);
                PutIdleMsgBuff(pMsg);
            }
            gvLog(LOG_MSG, "(TcpServer::RecvParse) left receive parser... pMsg:%p", pMsg);
        }
        usleep(1);
    }
}
Пример #2
0
void* TcpServer::MioRun(void *pData)
{
    TcpServer* pthis = NULL;
    mio2_t m = NULL;
    if (pData) {
        m = ((c2s_t)pData)->mio2;
        pthis = (TcpServer*)(((c2s_t)pData)->pvoid);
    }
    if (!pthis || !m) {
        gvLog(LOG_ERR_SYS, "(TcpServer::MioRun) mio run start fail by error param");
        return NULL;
    }

    while (pthis->IsRunning()) {
        {
            CAutoLock lock(&(pthis->m_tMutexMio));
            mio2_run(m, 5);
        }
        usleep(1);
    }
    return NULL;
}
Пример #3
0
void* TcpServer::DataParse(void* pData)
{
    TcpServer* pthis = NULL;
    mio2_t m = NULL;
    LPMESSAGE_DATA pMsg = NULL;
    DataParser* pDataParser = NULL;

    if (pData) {
        m = ((c2s_t)pData)->mio2;
        pthis = (TcpServer*)(((c2s_t)pData)->pvoid);
    }
    if (!pthis || !m) {
        gvLog(LOG_ERR_SYS, "(TcpServer::DataParse) process pool start fail by error param");
        return NULL;
    }

    pDataParser = new DataParser();
    if (!pDataParser) goto ErrDataParse;

    while (pthis->IsRunning() && !pthis->IsRestarting()) {
        pMsg = g_MsgListData->Get_Msg();
        if (pMsg) {
            gvLog(LOG_MSG, "(TcpServer::DataParse) entering data parser...");
            pDataParser->ParserData(pMsg);
            gvLog(LOG_MSG, "(TcpServer::DataParse) left data parser...");
            g_MsgListSnd->Put_Msg(pMsg);
        }
        usleep(1);
    }

ErrDataParse:
//    if (pVerDBMapping) {
//        pVerDBMapping->UnInit();
//        delete pVerDBMapping;
//    }
    if (pDataParser) {
        delete pDataParser;
    }
}
Пример #4
0
void* TcpServer::WaitHandle(void* pData)
{
    TcpServer* pthis = NULL;
    mio2_t m = NULL;
    if (pData) {
        m = ((c2s_t)pData)->mio2;
        pthis = (TcpServer*)(((c2s_t)pData)->pvoid);
    }

    if (!pthis || !m) {
        gvLog(LOG_ERR_SYS, "(TcpServer::WaitHandle) wait pool start fail by error param");
        return NULL;
    }

    LPMESSAGE_DATA pMsg = NULL;
    size_t ileftUnsend;
    int iSetp = 0;
    bool bIsError = true;
    unsigned int iTimeOut = 0;
    while (pthis->IsRunning()) {
        pMsg = g_MsgListWait->Get_Msg();
        if (pMsg) {
            bIsError = true;
            if (ioctl(pMsg->iFd, SIOCOUTQ, (char*)&ileftUnsend) >= 0) {
                if (0 == ileftUnsend) {
                    /// success
                    gvLog(LOG_MSG, "(TcpServer::WaitHandle) MSG: success iFd:%d pMsg:%p tokenid:%s msg:%s", pMsg->iFd, pMsg, pMsg->cBuffer, pMsg->pData->m_cRsp);
                    if (pMsg->bSendAndClose){
                        mio2_close(m, pMsg->iFd);
                    }
                    else {
                        PushManager::GetInstance()->SendSuccess(pMsg->iFd);
                    }
                    gvLog(LOG_MSG, "(TcpServer::WaitHandle) MSG: handle finish iFd:%d pMsg:%p tokenid:%s", pMsg->iFd, pMsg, pMsg->cBuffer);
                    pMsg->pData->m_cRsp[pMsg->pData->m_usRspTotal] = 0;
                    PutIdleMsgBuff(pMsg);
                    bIsError = false;
                }
                else {
                    iTimeOut = pMsg->lLastSendTime + WAITTIME_INVAL;
                    if (GetTickCount() < iTimeOut) {
                        /// wait
                        g_MsgListWait->Put_Msg(pMsg);
    //                    gvLog(LOG_MSG, "(TcpServer::WaitHandle) MSG: GetTickCount:%d pMsg->lLastSendTime:%d", GetTickCount(), pMsg->lLastSendTime);
                        bIsError = false;
                    }
                }
            }

            if (bIsError) {
                /// fail
                PushManager::GetInstance()->SendFail(pMsg);
                mio2_close(m, pMsg->iFd);

                gvLog(LOG_MSG, "(TcpServer::WaitHandle) MSG: fail iFd:%d pMsg:%p", pMsg->iFd, pMsg);
                PutIdleMsgBuff(pMsg);
            }
        }
        usleep(1);
    }
    return NULL;
}
Пример #5
0
void* TcpServer::RspParse(void* pData)
{
    TcpServer* pthis = NULL;
    mio2_t m = NULL;
    LPMESSAGE_DATA pMsg = NULL;

    if (pData) {
        m = ((c2s_t)pData)->mio2;
        pthis = (TcpServer*)(((c2s_t)pData)->pvoid);
    }
    if (!pthis || !m) {
        gvLog(LOG_ERR_SYS, "(TcpServer::RspParse) response pool start fail by error param");
        return NULL;
    }

    RspParser* pRspParser = new RspParser();
    if (!pRspParser) return NULL;

    int iSendResult = 0;
    while (pthis->IsRunning()) {
        pMsg = g_MsgListSnd->Get_Msg();
        if (pMsg) {
            gvLog(LOG_MSG, "(TcpServer::RspParse) entering send parser...  pMsg:%p pMsg->iFd:%d", pMsg, pMsg->iFd);
            iSendResult = pRspParser->ParserData(pMsg);
            gvLog(LOG_MSG, "(TcpServer::RspParse) iSendResult:%d pMsg->iFd:%d", iSendResult, pMsg->iFd);
            if (0 == iSendResult) {
                // time out
                //send buffer reget
                g_MsgListSnd->Put_Msg(pMsg);
            }
            else if (-1 == iSendResult){
                // fail
                /*
                {
                    CAutoLock lock(&(pthis->m_tMutexMio));
                    mio_close_quick(m, pMsg->iFd);
                }
                */
                if (IsAvailableIndex(pMsg->iFd)) {
                    PushManager::GetInstance()->SendFail(pMsg);
                    mio2_close(m, pMsg->iFd);
                }
                else {
                    /// ERROR 不应该有这种情况出现
                    gvLog(LOG_ERR_USER, "(TcpServer::RspParse) ERR: pMsg->iFd:%d", pMsg->iFd);
                }

                gvLog(LOG_MSG, "(TcpServer::RspParse) MSG: fail iFd:%d pMsg:%p", pMsg->iFd, pMsg);
                PutIdleMsgBuff(pMsg);
            }
            else if (-2 == iSendResult) {
                // wait

            }
            else {
                // success
                gvLog(LOG_MSG, "(TcpServer::RspParse) iFd:%d pMsg->bSendAndClose:%d", pMsg->iFd, pMsg->bSendAndClose);
                if (pMsg->bSendAndClose){
                    mio2_close(m, pMsg->iFd);
                }
                else {
                    PushManager::GetInstance()->SendSuccess(pMsg->iFd);
                }

                gvLog(LOG_MSG, "(TcpServer::RspParse) MSG: success iFd:%d pMsg:%p", pMsg->iFd, pMsg);
                PutIdleMsgBuff(pMsg);
            }
            gvLog(LOG_MSG, "(TcpServer::RspParse) left send parser...");
        }
        usleep(1);
    }
}