[C/UNIX] *Resolu* Les threads

*Resolu* Les threads [C/UNIX] - C - Programmation

Marsh Posté le 23-11-2004 à 17:37:04    

Bah voila,
 
Cette année j'ai un prof de merde en C, du coup je galere un peu a m'y retrouver.
Pourriez vous m'aider?  
 
Je souhaite recupère le resultat de mon thread mais ca marche pas je sais pas pourquoi...
 

Code :
  1. /* gcc -Wall -ainsi -pedantic -o scanTCP scanTCP.c -lpthread */
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netdb.h>
  6. #include <string.h>
  7. #include <netinet/in.h>
  8. #include <unistd.h>
  9. struct Data
  10. {
  11.   int socket_service;
  12.   struct sockaddr_in adr;
  13. };
  14. void* testConnexion(void* data)
  15. {
  16.   struct Data sock = *((struct Data*) data);
  17.   char* resultat = "";
  18.   /* Connexion au serveur */
  19.   if ((connect (sock.socket_service,(struct sockaddr *) &sock.adr, sizeof(struct sockaddr_in))) == -1)
  20.     resultat = "FERME";
  21.   else
  22.     resultat = "OUVERT";
  23.  
  24.   pthread_exit((void*) resultat);
  25. }
  26. main (int argc, char** argv)
  27. {
  28.   if (argc > 2)
  29.     {
  30.       struct Data sockData;
  31.       struct hostent* host;
  32.       int thread, port;
  33.       char*  mach_srv = "";
  34.       char** reponse;
  35.       mach_srv = argv[1];
  36.       port = atoi(argv[2]);
  37.      
  38.       if ((sockData.socket_service = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
  39. {
  40.   perror("Creation socket impossible\n" );
  41.   exit(1);
  42. }
  43.      
  44.       if ((host = gethostbyname(mach_srv)) == NULL)
  45. {
  46.   perror ("Nom de l'hote inconnu\n" );
  47.   exit(1);
  48. }
  49.      
  50.       /* configuration de l'adresse */
  51.       bcopy(host->h_addr, &sockData.adr.sin_addr, host->h_length); /* bcopy(src, dest, lg) */
  52.       sockData.adr.sin_family = AF_INET;
  53.       sockData.adr.sin_port = htons(port);
  54.      
  55.       /*
  56. Creation d'un nouveau thread s'excutant simultanment avec
  57. son pere. Le nouveau thread execute la fonction "testConnexion"
  58. avec l'argument sockData. La variable thread contient a present
  59. le descripteur du thread.
  60.       */
  61.       pthread_create ((pthread_t *) &thread, NULL, testConnexion, (void *) &sockData);
  62.       /*erreur*/
  63.       /* attente du fils du thread et recup de sa valeur retour */
  64.       pthread_join ( thread, (void**) reponse);
  65.      
  66.       printf("Le port %d est %s", port, (char*) *reponse);
  67.      
  68.       exit(0);
  69.     }
  70.   else
  71.     {
  72.       printf ("Vous devez taper qqch du genre :\n ./scanTCP 127.0.0.1 21\n" );
  73.       exit(-1);
  74.     }
  75. }


 
Bien sur je suis pas un pro du C, alors je suis pas l'abri d'une erreur a la con.
 
PS: Si je créé un thread comme ca, le pere peut mourrir en sachant que son fils lui  survivra ?

Code :
  1. /* threads */
  2.       /* initialisation des attribut du thread */
  3.       pthread_attr_init(&attr);
  4.       /* detachement du fils et du pere */
  5.       pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED );
  6.       /* creation du thread avec ses attributs */
  7.       nb = NB_PACKET;
  8.       pthread_create ((pthread_t *) &thread, &attr, envoitICMP, (void *) &nb);


Message édité par !cricri le 25-11-2004 à 10:58:04
Reply

Marsh Posté le 23-11-2004 à 17:37:04   

Reply

Marsh Posté le 25-11-2004 à 10:57:34    

on peut aussi utiliser  pthread_detach(tid) pour detaché le thread

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed