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

C Discussion :

[socket-pthread-linux]printf non executé


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Par défaut [socket-pthread-linux]printf non executé
    Bonjour,
    J'aimerais faire un programme serveur-clients: le serveur,sous Linux, doit accepter plusieurs clients donc j'ai fais l'écoute dans le main et à chaque fois que je reçois une connexion, je créer un thread pour gérer la connection:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <pthread.h>
     
    void monthread()
    {
    	printf("message2");
    }
    int main()
    {
        int serveur,client=0;
        struct sockaddr_in cserv,cclient;
        int taille=sizeof(cclient);
        pthread_t checkthread;    
        cserv.sin_port=htons(1026);
        cserv.sin_family=AF_INET;
        cserv.sin_addr.s_addr=htonl(INADDR_ANY);
        serv=socket(2,1,0);
        bind(serveur,(struct sockaddr*)&cserv,sizeof(cserv));
        listen(serv,0);
        while(1)
        {
            client=accept(serveur,(struct sockaddr*)&cclient,&taille);
    		printf("message1");
            if(client)
            {
                close(client);
                pthread_create(&checkthread, NULL, monthread, NULL);
     
            }
     
        }
    }
    Le problème est que les printf ne semble pas s'executer ("message1" et "message2" ne sont pas affiché) et je ne comprends pas pourquoi...
    pouvez vous m'aidez un peu^^
    merci d'avance

  2. #2
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    Le problème est que les printf ne semble pas s'executer ("message1" et "message2" ne sont pas affiché) et je ne comprends pas pourquoi...
    stdout est buffurisée. Ajoute des \n (ou fflush(stdout)) et tu devrais avoir tes messages.

    Par contre, je ne sais pas si tu as supprimé du code, mais
    • tu ne teste pas les valeurs de retour de socket, bind, listen
    • serv et serveur semblent être la même variable
    • tu ferme ta (nouvelle) socket avant d'appeler ton thread
    • le prototype d'un thread est void *fun(void *)
    • utilise plutôt les define AF_* plutôt que des valeurs numérique pour socket()
    • tu mets 0 pour le backlog de listen(), c'est peut-être un "peu juste"

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Par défaut
    merci pour la réponse très rapide!
    En effet j'ai supprimé du code et bidouillé un peu pour chercher l'erreur(sans succes...) d'où les incohérences que vous avez remarqué.

    par contre je ne comprends pas bien ce que vous entendez par "stdout est buffurisée" : le \n fonctionne bien (j'ai pas essayer le fflush) mais je vois pas bien pourquoi? comment le \n ou le fflush a agit sur stdout et que veux dire buffurisée(qu'est ce qui provoque ce phénomène)?

    et aussi pourquoi le 0 du listen() est un peu juste?
    (ça fait pas mal de questions tous ça désolé de vous embêter avec celles-ci!!)

  4. #4
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Citation Envoyé par sebatlante Voir le message
    par contre je ne comprends pas bien ce que vous entendez par "stdout est buffurisée"
    Il fallait lire bufferisée (qui n'est pas plus français, mais bon). En fait, le system (je pense que c'est la libc) n'envoie pas de suite les données qu'elle a pour stdout, mais le garde dans un buffer qui est vidé:
    - quand il est suffisamment grand (aucune idée de la taille )
    - quand il y a un \n
    - quand on appelle fflush()
    http://c.developpez.com/faq/?page=cl...an#CONS_fflush

    et aussi pourquoi le 0 du listen() est un peu juste?
    Si deux clients se connectent en même temps, et que le serveur est en train de traiter la première connexion, le deuxième ne pourra pas se connecter. Le 0 signifie que la taille de la file d'attente est de 0. On peut mettre plutôt 10 par exemple.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 174
    Par défaut
    ok merci beaucoup pour ces précisions D[r]eadLock .

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2005, 18h29
  2. [C#] Requete non executés
    Par ducker88 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/07/2005, 10h55
  3. css non execute
    Par hunter dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 13/05/2005, 09h11
  4. [debutant][Classpath][Linux] Classe non trouvée
    Par oghma777 dans le forum Général Java
    Réponses: 5
    Dernier message: 15/10/2004, 21h26
  5. [Socket] Message different pour 2 execution similaire
    Par Erok dans le forum Entrée/Sortie
    Réponses: 24
    Dernier message: 13/05/2004, 10h49

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