示例#1
0
void UpdateStatsPacket::QueueUpdate(unsigned int nwId, ObjectAttributeIndex index, double value) {
    updateLock.lock();
    auto updates = updateQueue.find(nwId);
    if(updates != updateQueue.end()) {
        updates->second[index] = value;
        //std::cout << "[0] Queued Stat update with value: " << value << std::endl;
    } else {
        std::unordered_map<ObjectAttributeIndex, double> attributes;
        attributes[index] = value;
        updateQueue[nwId] = attributes;
        //std::cout << "[1] Queued Stat update with value: " << value << std::endl;
    }
    //std::cout << updateQueue[nwId].size() << " attribute updates of this object in total." << std::endl;
    if(updateQueue.size() >= UCHAR_MAX) {
        SendQueue();
    } else if(!updateFired) {
        updateFired = true;
        //just wait a little and then send them batched together
        //todo: make this batched stuff in a dedicated thread loop
        std::async(std::launch::async, []() {
            //std::cout << "Started Async sending..." << std::endl;
            std::chrono::milliseconds delay(100);
            std::this_thread::sleep_for(delay);
            SendQueue();
            updateFired = false;
        });
    }
    updateLock.unlock();
}
示例#2
0
    void SocketEndpoint::HandleSend(const ErrorCode& error, const size_t& bytes_sent)
    {
        if (error)
        {
            Close();
        }

        AddSent(bytes_sent);
        SendQueue();
    }
示例#3
0
void ClientContext::start()
{
    m_security.GenerateHandshake(
        GlobalConfigs::UseBlowfish      (),
        GlobalConfigs::UseSecurityBytes (),
        GlobalConfigs::UseHandshake     ()      );

    SendQueue();

    m_socket.async_receive(
        boost::asio::buffer(m_message, 4096),
        boost::bind(&ClientContext::message_recv, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
示例#4
0
int McuMessageHandler::PopQueue(int id, int seq, unsigned long *data, unsigned long *data2)
{
    int ret = 0;
    pthread_mutex_lock(&m_queueMutex);

    if(m_waitingQueue.size() <= 0)
    {
        LogUtility::Log(LOG_LEVEL_ERROR, "McuMessageHandler::PopQueue waiting queue empty.");
        pthread_mutex_unlock(&m_queueMutex);
        return -1;
    }

    StruMcuPacket *packet = *(m_waitingQueue.begin());
    
    if((packet->id == id) && (packet->seq == seq))
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::PopQueue correct resp.");
        if(data)
        {
            *data = packet->data;
        }
        if(data2)
        {
            *data2 = packet->data2;
        }
        m_waitingQueue.pop_front();
        DestroyPacket(packet);
        StopTimer(m_retryTimer);
        if(m_waitingQueue.size() > 0)
        {
            LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::PopQueue send queue");
            SendQueue();
        }
    }
    else
    {
        LogUtility::Log(LOG_LEVEL_ERROR, "McuMessageHandler::PopQueue incorrect resp(%d, %04x).", packet->seq, packet->id);
        ret = -1;
    }
    
    pthread_mutex_unlock(&m_queueMutex);
    
    return ret;
}
示例#5
0
void ClientContext::message_recv(const boost::system::error_code &ec, std::size_t recv)
{
    if(!m_socket.is_open())
    {
        disconnected(CLIENT_LOST_CONNECTION);
        return;
    }

    if(!ec)
    {
        printl("Client sent message to server. \n");
        //////////////////////////////////////////////////////////////////////////////////////

        m_security.Recv(m_message, recv);
        PacketContainer pc;

        if(m_security.HasPacketToRecv()) // else it was a security packet.
        {
            pc = m_security.GetPacketToRecv();
            HandleMessage(&pc);
        }
        else
        {
            SendQueue();
        }

        // after packet handled, receive a new one.
        m_socket.async_receive(
            boost::asio::buffer(m_message, 4096),
            boost::bind(&ClientContext::message_recv, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
    }
    else
    {
        if(recv == 0)
        {
            disconnected(CLIENT_LOST_CONNECTION);
            return;
        }

        std::cout << "Error occured: " << ec.message() << std::endl;
    }

};
示例#6
0
int McuMessageHandler::PushQueue(StruMcuPacket *packet)
{
    pthread_mutex_lock(&m_queueMutex);
    if(m_waitingQueue.size() >= MCU_MAX_WAITING_QUEUE)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::PushQueue full");
        pthread_mutex_unlock(&m_queueMutex);
        DestroyPacket(packet);
        return -1;
    }
    m_waitingQueue.push_back(packet);
    if(m_waitingQueue.size() == 1)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::PushQueue empty");
        SendQueue();
    }
    pthread_mutex_unlock(&m_queueMutex);
    return 0;
}
示例#7
0
void McuMessageHandler::HandleRetryTimer(void *)
{
    pthread_mutex_lock(&m_queueMutex);

    if(m_waitingQueue.size() <= 0)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::HandleRetryTimer empty");
        pthread_mutex_unlock(&m_queueMutex);
        return ;
    }

    StruMcuPacket *packet = *(m_waitingQueue.begin());
    if(packet->retry > MCU_MAX_RETRY_TIMES)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::HandleRetryTimer %d reach limit", packet->id);
        m_waitingQueue.pop_front();
        if((packet->id == MCU_POS_GET_PASSENGER) || (packet->id == MCU_POS_GET_DEAL))
        {
            int index = packet->data2;
            m_passengerRecord[index].state = STATE_TIMER;
            StartTimer(m_passengerRecord[index].posPassengerRecordTimer);
        }
        DestroyPacket(packet);
        if(m_waitingQueue.size() > 0)
        {
            LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::HandleRetryTimer proceed to next message");
            SendQueue();
        }
    }
    else
    {
        SendPacket(packet);
        packet->retry ++;
        StartTimer(m_retryTimer);
    }
    
    pthread_mutex_unlock(&m_queueMutex);
}