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 :

socket & select


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut socket & select
    salut a tous
    Je dois coder un serveur en C et j'utilise select pour gérer tous mes clients. J'ai quelques question a propos de select, que je n'ai pas trouvé dans le man.
    - pour detecter la fin d'une connexion d'un client (avec ctrl+d ou ctrl+c), c'est bien l'argument exceptfs de select qu'il faut utiliser ?
    - est-il possible de faire des copies des ensembles fd_set avec une simple affectation ? ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fd_set set1, set2;
    FD_ZERO(&set1);
    FD_SET(fd, &set1);
    set2 = set1;
    Merci d'avance pour vos reponses

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    - pour detecter la fin d'une connexion d'un client (avec ctrl+d ou ctrl+c), c'est bien l'argument exceptfs de select qu'il faut utiliser ?
    nope, c'est le readfd.
    tu lis ce qu'il arrive, si tu recois 0bytes ... c'est qu'il y'as plus personne au bout !

    - est-il possible de faire des copies des ensembles fd_set avec une simple affectation ?
    oui

    exemple de code
    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
     
    		read_fds = master;	// copy fd set to temp set
    		if (select (fdmax + 1, &read_fds, NULL, NULL, NULL) == -1)
    		{
    			perror ("select");
    			exit (1);
    		}
    [...]
    				if ((nbytes =
    				     recv (i, buf, sizeof (buf), 0)) <= 0)
    				{
    					// got error or connection closed by client
    					if (nbytes == 0)
    					{
    						// connection closed 
    					}
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut
    Je te remercie pour ta reponse
    J'ai fait le test, et j'obtiens 1 octet qd je fais un ctrl+D et 5 octets lors d'un ctrl+C :/

    EDIT: en fait, on obtiens bien 0 mais lorsque l'on tue le processus client

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh... Pour la copie de fd_set, je ne suis pas sûr du tout que ce soit supposé marcher partout:
    Le contenu d'un fd_set dépend de l'implémentation (sous Windows par exemple, c'est une liste de sockets), et le fd_set lui-même peut être presque n'importe quoi! (y compris des données qu'une simple affectation ne copie pas, par exemple un tableau ou une structure...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    Euh... Pour la copie de fd_set [...
    cela marche (apparement bien) sous windows et linux. (l'exemple et tiré d'un code source que j'utilise pour linux//windows).
    ce serait une tres bonne idée d'utiliser un memcpy pour lever toute ambiguitée ou possibilité d'erreurs frustrantes lors d'un port vers un autre systeme


    keyra: euh? aucune idée pourquoi tu obtiens ça ... ton client est sous windows je suppose ? (ctrl-D)
    faudrais voir du coté de la doc M$ si y'as rien qui en parle
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh, je pense qu'il est sous Linux, Ctrl-D c'est la fin d'entrée standard sous Linux (Ctrl-Z sous Windows).

    Et Ctrl-C, il me semble bien que ça tue le programme dans les deux cas... (SIGTERM sous Unixoïde, interceptable)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut
    Oui je suis sous Linux. Le programme client que j'utilise pour l'instant c'est un simple telnet.
    J'ai sniffé les paquets envoyés qd je fais un ctrl+C et c'est assez bizarre. Pas de RST voir un FIN, juste une paquet PUSH avec un checksum invalide, et la connexion est toujours active. C'est peu etre l'implementation de telnet qui en est la cause, dans ce cas ca devrait mieux fonctionner lorsque j'implementerais mon client

  8. #8
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    essaye avec netcat: http://netcat.sourceforge.net/

    il n'envoye que ce que tu lui donne ... ce qui n'est pas le cas de telnet.
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Socket avec select
    Par Khan34 dans le forum C++
    Réponses: 2
    Dernier message: 15/07/2012, 23h38
  2. Segment de mémoire partagée POSIX, socket et select
    Par Antoine J. dans le forum POSIX
    Réponses: 2
    Dernier message: 06/12/2011, 16h42
  3. [Réseau] select() et accept() sur plusieurs sockets
    Par Higestromm dans le forum C++
    Réponses: 13
    Dernier message: 13/10/2008, 09h18
  4. Socket multithread & select
    Par crealinks dans le forum Réseau
    Réponses: 3
    Dernier message: 22/11/2006, 21h36
  5. [SOCKET] TCP : select devant send();
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 02/03/2004, 18h10

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