Historique des modifications - Message

Message #5436

Sujet: Lib reseau


TypeDateAuteurContenu
Dernière modification04-01-2009 18:19:51yamashi
Euuuu y a mieu que les thread il y a select pour l'asynchrone et ca enlève les problème de thread et les mutex qui sont rappelons le 30fois plus lent que si executé normalement.

Voila la code que j'utilise côté serveur :

int server::run()
{
    int code = select (FD_SETSIZE, &readfs, NULL, NULL, &timeout);
    switch(code)
    {
        case 0:
        if(m_client)
            sleep(10);
            _world.update();
        break;
        case -1:
        cout << "select() error" << endl;
        break;
        default:
        if (FD_ISSET (sock, &readfs))
        {
            if((NewConnection = accept (sock, (SOCKADDR *) &sin,&recsize)) == INVALID_SOCKET)
            {
                closesocket( sock );
                return 1;
            }

            m_log->_Log("Client connected with socket # %d from %s:%d", NewConnection, inet_ntoa (sin.sin_addr), htons (sin.sin_port));

            session = new WorldSession(NewConnection,&_world);
            _world.addSession(session);

            m_client++;
        }
        else if(FD_ISSET (usock, &readfs))
        {
            SOCKADDR_IN clientAddr = { 0 };
            int recsize = sizeof clientAddr;
            char buffer[1024];
            int n = recvfrom (usock, buffer, sizeof buffer - 1, 0, (SOCKADDR *) & clientAddr, (socklen_t*)&recsize);
            cout << "UDP, n = " << n << " message = " << buffer <<" PORT = " << clientAddr.sin_port << endl;
        }
        else
        {
            while((session = _world.getNextSession())!= NULL)
            {
                if(FD_ISSET(session->m_sock, &readfs))
                {
                    if(session->onRead() == 1)
                    {
                        cout << "Client disconnected" << endl;
                        _world.removeSession(session);
                        delete session;
                        m_client--;
                    }
                    break;
                }
            }
        }
        break;
    }
    if(m_client)
        _world.update();
    else
        sleep(10);
}

void server::initFD()
{
    FD_ZERO (&readfs);
    FD_SET (sock, &readfs);
    FD_SET (usock, &readfs);
    while((session = _world.getNextSession())!= NULL)
    {
        FD_SET (session->m_sock, &readfs);
    }
}

J'accepte des connexion, je recois des paquets TCP et UDP en même puis j'ai 1 thread CLI pour les commandes et 1thread update qui traite les paquets de chaque client.
Création du message04-01-2009 18:15:07yamashi
Euuuu y a mieu que les thread il y a select pour l'asynchrone et ca enlève les problème de thread et les mutex qui sont rappelons le 30fois plus lent que si executé normalement.

Voila la code que j'utilise côté serveur :

int server::run()
{
    int code = select (FD_SETSIZE, &readfs, NULL, NULL, &timeout);
    switch(code)
    {
        case 0:
        if(m_client)
            sleep(10);
            _world.update();
        break;
        case -1:
        cout << "select() error" << endl;
        break;
        default:
        if (FD_ISSET (sock, &readfs))
        {
            if((NewConnection = accept (sock, (SOCKADDR *) &sin,&recsize)) == INVALID_SOCKET)
            {
                closesocket( sock );
                return 1;
            }

            m_log->_Log("Client connected with socket # %d from %s:%d", NewConnection, inet_ntoa (sin.sin_addr), htons (sin.sin_port));

            session = new WorldSession(NewConnection,&_world);
            _world.addSession(session);

            m_client++;
        }
        else if(FD_ISSET (usock, &readfs))
        {
            SOCKADDR_IN clientAddr = { 0 };
            int recsize = sizeof clientAddr;
            char buffer[1024];
            int n = recvfrom (usock, buffer, sizeof buffer - 1, 0, (SOCKADDR *) & clientAddr, (socklen_t*)&recsize);
            cout << "UDP, n = " << n << " message = " << buffer <<" PORT = " << clientAddr.sin_port << endl;
        }
        else
        {
            while((session = _world.getNextSession())!= NULL)
            {
                if(FD_ISSET(session->m_sock, &readfs))
                {
                    if(session->onRead() == 1)
                    {
                        cout << "Client disconnected" << endl;
                        _world.removeSession(session);
                        delete session;
                        m_client--;
                    }
                    break;
                }
            }
        }
        break;
    }
    if(m_client)
        _world.update();
    else
        sleep(10);
}

void server::initFD()
{
    FD_ZERO (&readfs);
    FD_SET (sock, &readfs);
    FD_SET (usock, &readfs);
    while((session = _world.getNextSession())!= NULL)
    {
        FD_SET (session->m_sock, &readfs);
    }
}

J'accepte des connexion, je recois des paquets TCP et UDP en même puis j'ai 1 thread CLI pour les commandes et 1thread update qui traite les paquets de chaque client.

Retour

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
99 invités en ligne
membre en ligne: -
RSS Feed