示例#1
0
int neUserManager::checkPingAndStatus(neUser *user)
{
    int ret = 0;
    nemsgPing pingMsg((ncSocket *)0);
    nemsgStatus statusMsg((ncSocket *)0);
    static int pingTime = g_config.getUserPingDelay();
    static int statusTime = g_config.getUserStatusDelay();

    assert(user);
    assert(user->getSocket());

    /* check if a ping message should be sent to the user */
    if (user->isPingTime())
    {
        pingMsg.setSocket(user->getSocket());
        user->lockWriteLock();
        if (pingMsg.send())
        {
            iprintf("Removing User %x (ping send failed).\n",user);
            ret = 1;
        }
        else
        {
            user->setPingTime(pingTime);

            /* check if a status message should be sent to the user */
            if (user->isStatusTime())
            {
                statusMsg.setSocket(user->getSocket());
                if (statusMsg.send
                    (m_serverStatus->getNumUsers(),
                     m_serverStatus->getNumUserFiles(),
                     m_serverStatus->getTotalSizeofFilesInMB()))
                {
                    iprintf("Removing User %x (status send failed).\n",user);
                    ret = 1;
                }
                else
                {
                    user->setStatusTime(statusTime);
                }
            }
        }
        user->unlockWriteLock();
    }
    return ret;
}
void Membership::listeningThread()
{
    //char buffer[BUFFER_MAX];
    struct Message msg;
    std::string sender;
    srand (time(NULL));
    logFile<< std::endl <<"listeningThread: thread begins"<<std::endl; 
    while (!killListeningThread)
    {
        if (members.empty())
        {
            //In case the node decided to leave
            continue;
        }

        int byte_count = receiveUDP(sockfd, (char*)&msg, sizeof(msg), sender);

        logFile << "listeningThread: Receive message from: " << sender.c_str() << " ";
        logFile << "type: " << msg.type << "ttl: " << (int)msg.TTL << std::endl;

        if (byte_count != sizeof(msg))
        {
            logFile << "ERROR listeningThread: size receiving incorrect: Message dropped" << std::endl;
            continue;
        }
        
        switch (msg.type)
        {
            case MSG_PING:  
                pingMsg(msg, sender);
                break;
            case MSG_ACK:
                ackMsg(msg, sender);
                break;
            case MSG_PIGGY:         
                piggyMsg(msg, sender);
                break;
            case MSG_PIGGY_PING:    
                piggyPingMsg(msg, sender);
                break;
            case MSG_PIGGY_ACK:     
                piggyAckMsg(msg, sender);
                break;
            case MSG_FAIL:          
                failMsg(msg, sender);
                break;
            case MSG_JOIN:          
                joinMsg(msg, sender);
                break;
            case MSG_LEAVE:         
                leaveMsg(msg, sender);
                break;
            case MSG_ELECTION:         
                electionMsg(msg, sender);
                break;
            case MSG_BULLY:         
                bullyMsg(msg, sender);
                break;
            case MSG_NEWLEADER:         
                newLeaderMsg(msg, sender);
                break;
            
            default:
        	   logFile<<"ERROR: listeningThread: received msg does not belong to a type"<<std::endl;
        }

    }
}