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 :

débutante avec les threads


Sujet :

Réseau C

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 22
    Par défaut débutante avec les threads
    Bonjour à tous,
    Je commence à travailler avec les threads et j'arrive pas bien à les manipuler.
    Voici mon problème, je veux coder un simple programme qui fait agit comme suit:
    - Un programme principal (main) joue le rôle d'un serveur qui se met à l'écoute des connexions entrantes. A l'acceptation d'une nouvelle connexion il stocke le contenue reçu dans un buffer.
    - Un thread B qui manipule le buffer rempli par le main. Ce thread doit être en veille, s'il voit que la taille du buffer n'est pas nulle, il se réveille pour faire des traitements sur le buffer.

    La main fonctionne très bien, mon problème c'est avec les threads. Le thread que j'ai codé ne fonctionne pas bien. A l'exécution, même si le buffer est vide, le programme affiche des hellos. Svp, pouvez vous m'aider à résoudre ce mystère … elle est ou la faute dans ma manipulation des threads … et si ce que j'ai fait ne tient pas.. Pouvez vous me dire comment faire ou me donnez un exemple de source qui fait ce que je voudrais faire.
    Merci beaucoup.

    Voici mon 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
    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
    #include <stdio.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <pthread.h>
    #define MAXPENDING 5    /* Max connection requests */
    #define BUFFSIZE 32
     
    pthread_mutex_t	counter_mutex = PTHREAD_MUTEX_INITIALIZER;
     
    void Die(char *mess) { perror(mess); exit(1); }
     
    void *handle(void *buff){
     
    	char *buffer;
    	int i;
    	buffer = (char *) buff;
    	if(sizeof(buffer) != 0){
    		for(i=0; i < sizeof(buffer); i++){
    			printf(" hello %c\n",buffer[i]);
    		}
    	}
    }
     
     
    int main(int argc, char *argv[]) {
     
    	int serversock, clientsock;
    	struct sockaddr_in echoserver, echoclient;
    	char buffer[BUFFSIZE];
    	pthread_t hdl;
            int i, received = -1;
     
    	if (argc != 2) {
    		fprintf(stderr, "USAGE: echoserver <port>\n");
    		exit(1);
    	}
    	/* Create the TCP socket */
    	if ((serversock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
    		Die("Failed to create socket");
    	}
    	/* Construct the server sockaddr_in structure */
    	memset(&echoserver, 0, sizeof(echoserver));       /* Clear struct */
    	echoserver.sin_family = AF_INET;                  /* Internet/IP */
    	echoserver.sin_addr.s_addr = htonl(INADDR_ANY);   /* Incoming addr */
    	echoserver.sin_port = htons(atoi(argv[1]));       /* server port */
    	/* Bind the server socket */
    	if (bind(serversock, (struct sockaddr *) &echoserver, sizeof(echoserver)) < 0) {
    		Die("Failed to bind the server socket");
    	}
    	/* Listen on the server socket */
    	if (listen(serversock, MAXPENDING) < 0) {
    		Die("Failed to listen on server socket");
    	}
    	/* Run until cancelled */
     
    	pthread_create(&hdl, NULL, &handle, (void *) &buffer);
     
    	while (1) {
    		unsigned int clientlen = sizeof(echoclient);
                  	/* Wait for client connection */
                  	if ((clientsock = accept(serversock, (struct sockaddr *) &echoclient, &clientlen)) < 0) {
                    	Die("Failed to accept client connection");
                  	}
                 	fprintf(stdout, "Client connected: %s\n", inet_ntoa(echoclient.sin_addr));
    		/* Receive message */
    		if ((received = recv(clientsock, buffer, BUFFSIZE, 0)) < 0) {
    			Die("Failed to receive initial bytes from client");
    		}
    		/* Send bytes and check for more incoming data in loop */
    		close(clientsock);
    	}
    }
    Merci,
    Sara

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut et bienvenue sur developpez.com

    Citation Envoyé par dc.sara Voir le message
    A l'exécution, même si le buffer est vide, le programme affiche des hellos. Svp, pouvez vous m'aider à résoudre ce mystère … elle est ou la faute dans ma manipulation des threads …
    Normal ! Lorsque tu créées un thread avec pthread_create, celui-ci est directement exécuté. Ce qu'il te faudrais, c'est un thread qui tourne en boucle mais qui se mette en pause par exemple avec les conditions.

    Prend le temps de lire ce tutoriel: http://franckh.developpez.com/tutoriels/posix/pthreads/
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 22
    Par défaut
    merci bcp Franck.H pour ton aide précise .. j'ai reussi à résoudre le probleme avec tes conseils précieux ...
    @+ et à d'autres problèmes .... lol

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

Discussions similaires

  1. [log4j][débutant] Bonnes pratiques avec les threads ?
    Par scougirou dans le forum Logging
    Réponses: 1
    Dernier message: 13/07/2007, 16h27
  2. Débutant avec les Threads
    Par Invité dans le forum AWT/Swing
    Réponses: 18
    Dernier message: 13/06/2007, 17h58
  3. Probleme avec les threads
    Par Orahn dans le forum MFC
    Réponses: 5
    Dernier message: 04/11/2005, 10h14
  4. Réponses: 5
    Dernier message: 10/05/2005, 10h22
  5. [langage] Perl a t'il été compiler avec les threads
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 07/05/2005, 15h00

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