IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

select() ne détecte rien! oubien?


Sujet :

Réseau C

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut select() ne détecte rien! oubien?
    Hej salut;
    Voilà, j'ai un souci: je fais un sorte de wrapper c++ des fonctions de base de réseau unix.
    j'ai dans ma classe server une méthode update qui s'occupe de raffraichir les connexions et voir s'il n'y a rien de neuf.
    Mon problème est que mon select retourne toujours 0.
    Même si mon client arrive à se connecter à la socket sans erreur, et à y envoyer un message.
    Mon serveur ne détecte pas la connexion et ducoup ne reçoit pas nonplus le message.

    Chez moi, Serveur hérite d'une classe Node contenant un sockaddr un pointeur vers un objet Socket( qui lui contient juste son fd)

    voici le code de mon serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #ifndef SERVER_HPP
    #define SERVER_HPP
     
    #include "node.hpp"
    #include "remoteclient.hpp"
    #include <vector>
     
    typedef std::vector<RemoteClient> clientList;
     
     
    class Server : public Node
    {
    	public:
    		Server();
    		Server(const portNr&);
    		cmdQueue update();
    		RemoteClient& getClient(unsigned&);
    		Server& removeClient(unsigned&);
     
    	private:
    		clientList clients;
    };	
     
    #endif
    serveur.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #include "server.hpp"
     
    #include "node.hpp"
    #include "socket.hpp"
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <stdexcept>
    #include <iostream>
     
    #define MAX_CONN 20
     
     
    Server::Server(){}
     
    Server::Server(const portNr& p)
    :Node(p)
    {
    	sock->sbind(*this);
    	sock->slisten(MAX_CONN);	
    }
     
    //LA METHODE POSANT PROBLEME
    cmdQueue Server::update()
    {
    	using namespace std;
    	cmdQueue ret;
     
    	//initializing an fd_set
    	fd_set set;
    	FD_ZERO(&set);
    	FD_SET(sock->getFd(), &set);
     
     
    	struct timeval timeout;
    	timeout.tv_sec=0;
    	timeout.tv_usec = 50000;
     
     
    	for(unsigned i=0; i<clients.size(); ++i)
    	{
    		FD_SET(clients[i].getSocketFd(), &set);
    // clients étant un attribut de la classe Serveur étant un vecteur de RemoteClient, héritant aussi de Node mais qui représente une connexion entrante.
    	}
     
    	cout << flush;
     
    	//select
    	int s=select(clients.size()+2, &set, NULL, NULL, &timeout);
    	cout << s << " ";
     
    	if(s==-1)
    	{
    		throw std::runtime_error("runtime_error: Server: update: select");
    	}
     
    	//check for new pending connexions
    	if(FD_ISSET(sock->getFd(), &set))
    	{
    		cout << "nouvelle connexion" << endl ;
    		clients.push_back(sock->saccept());
     
    	}
     
    	//check for new incoming data
    	for(unsigned i=0; i<clients.size(); ++i)
    	{
    		cout << "incoming data" << endl;
    		if(FD_ISSET(clients[i].getSocketFd(), &set))
    		{
    			cmdQueue Q=clients[i].update();
    			ret.append(Q);					
    		}
    	}
     
    	return ret;
    }
     
     
     
     
    RemoteClient& Server::getClient(unsigned& i)
    {
    	return clients[i];
    }
     
    Server& Server::removeClient(unsigned& i)
    {
    	clientList::iterator it(clients.begin());
    	it+=i;
    	clients.erase(it);
    	return *this;
    }

    J'espere que vous pourrez m'aider :/
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [MySQL] Mise à jour après selection du champs , rien ne se passe ?
    Par Invité dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/02/2013, 20h53
  2. [Oracle 10 XE] Un select n'affiche rien
    Par dingo200 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 21/10/2008, 23h07
  3. CRYSTAL XI R2 Empécher éxécution état si le select ne renvoie rien
    Par lolafrite dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 25/09/2007, 10h01
  4. autofilter tester que la selection ne renvoit rien
    Par amaury57 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/06/2007, 13h53
  5. [Java][debutant]select count(*) ne retourne rien !!
    Par Invité dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/01/2007, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo