Historique des modifications - Message

Message #5436

Sujet: Lib reseau


Type Date Auteur Contenu
Dernière modification 04-01-2009 18:19:51 yamashi
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 message 04-01-2009 18:15:07 yamashi
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

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
104 invités en ligne
membre en ligne: -
RSS Feed