Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2731 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C/UNIX] tester les port ouvert en TCP

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C/UNIX] tester les port ouvert en TCP

n°907303
3xc4l18ur
question = ( to ) ? be : ! be;
Posté le 25-11-2004 à 00:18:42  profilanswer
 

Bah voila,  
 
Je cherche a savoir si un port est ouverte en tcp...
Enfin c'est pas tout a fait, je sais comment savoir si UN port est ouvert en TCP, mais je veux passé a l'etape suivante, c'est a dire tester tt les ports de l'adresse avec du multi-threading et ecrire le port ouvert dans un fichier(gérer par un semaphore)
 
Probleme... evidemment ca marche pas... un idée ?
 

Code :
  1. /*
  2. * Cette variante scanne tous les ports d'une adresse
  3. * Les ports ouverts en TCP sont loggs dans un fichier
  4. * nomm adresse.txt
  5. * Les threads ecriront chacun leur tour dans le fichier
  6. * a l'aide d'une semaphore
  7. */
  8. #include <stdio.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netdb.h>
  12. #include <string.h>
  13. #include <netinet/in.h>
  14. #include <unistd.h>
  15. #include <semaphore.h>
  16. #include <sys/stat.h>
  17. #include <fcntl.h>
  18. #define MAX_PORT 65536  /* Le nombre total port sur une adresse */
  19. static sem_t fichierDispo; /* semaphore qui va coordonne l'ecriture dans le fichier */
  20. FILE* fichier;               /* le descripteur du fichier ouvert */
  21. struct Data
  22. {
  23.   int socket_service;
  24.   struct sockaddr_in adr;
  25. };
  26. void* testConnexion(void* data)
  27. {
  28.   struct Data sock = *((struct Data*) data);
  29.   uint16_t port = ntohs(sock.adr.sin_port);
  30.  
  31.   /*  prise de la ressource P(1)*/
  32.   sem_wait(&fichierDispo); //bloquant si la ressource n'est pas libre
  33.   /* Connexion au serveur */
  34.   if ((connect (sock.socket_service,(struct sockaddr *) &sock.adr, sizeof(struct sockaddr_in))) != -1)
  35.   {
  36.     printf("Le port %d est ouvert en TCP\n", port);
  37.     fprintf( fichier, "Le port %d est ouvert en TCP\n", port);
  38.   } 
  39.   /*  relache de la ressource V(1)*/
  40.   sem_post(&fichierDispo);
  41.  
  42.   pthread_exit(NULL);
  43. }
  44. main (int argc, char** argv)
  45. {
  46.   if (argc > 1)
  47.     {
  48.       struct Data sockData;
  49.       struct hostent* host;
  50.       int thread, i;
  51.       char*  mach_srv = "";
  52.       char* reponse;
  53.       mach_srv = argv[1];
  54.       /* mise en place de la semaphore */
  55.       sem_init(&fichierDispo, 0, 1); //0 pour lui dire que la semaphore est local au processus courrant, et 1 pour la valeur de la ressource dispo  
  56.            
  57.       if ((sockData.socket_service = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
  58. {
  59.   perror("Creation socket impossible\n" );
  60.   exit(1);
  61. }
  62.      
  63.       if ((host = gethostbyname(mach_srv)) == NULL)
  64. {
  65.   perror ("Nom de l'hote inconnu\n" );
  66.   exit(1);
  67. }
  68.      
  69.       /* configuration de l'adresse */
  70.       bcopy(host->h_addr, &sockData.adr.sin_addr, host->h_length); /* bcopy(src, dest, lg) */
  71.       sockData.adr.sin_family = AF_INET;
  72.            
  73.       /**  
  74.        * creation du fichier a ecrire
  75.        * Si le fichier existe deja, il sera ecraser
  76.        */
  77.       char* nomfichier = argv[1];
  78.       strcat(nomfichier,".txt" );
  79.       fichier = fopen(nomfichier, "w" );
  80.       for(i = 0; i <= MAX_PORT; i++)
  81. {
  82.   sockData.adr.sin_port = htons(i);
  83.  
  84.   /*
  85.     Creation d'un nouveau thread s'excutant simultanment avec
  86.     son pere. Le nouveau thread execute la fonction "testConnexion"
  87.     avec l'argument sockData. La variable thread contient a present
  88.     le descripteur du thread.Le NULL peut etre remplac par des options
  89.   */
  90.   pthread_create ((pthread_t *) &thread, NULL, testConnexion, (void *) &sockData);
  91.   /* detachement du pere et du fils */
  92.   pthread_detach(thread);
  93. }
  94.      
  95.       exit(0);
  96.     }
  97.   else
  98.     {
  99.       printf ("Vous devez taper qqch du genre :\n ./scanTCP1 127.0.0.1\n" );
  100.       exit(-1);
  101.     }
  102. }


 
edit: Quelque changement dans le code, mais toujours le meme probleme


Message édité par !cricri le 25-11-2004 à 10:55:35
mood
Publicité
Posté le 25-11-2004 à 00:18:42  profilanswer
 

n°907312
Taz
bisounours-codeur
Posté le 25-11-2004 à 00:21:28  profilanswer
 

t'aime pas nmapfe ? t'as regardé libprelude ?

n°907317
3xc4l18ur
question = ( to ) ? be : ! be;
Posté le 25-11-2004 à 00:24:09  profilanswer
 

C'est pour un tp !

n°907384
matafan
Posté le 25-11-2004 à 02:44:07  profilanswer
 

Si tu nous disais ce qui ne marche pas ?


Message édité par matafan le 25-11-2004 à 02:44:25
n°907490
3xc4l18ur
question = ( to ) ? be : ! be;
Posté le 25-11-2004 à 10:41:25  profilanswer
 

Je pensais qu'en vous donnant le code entier vous le testeriez et le constateriez par vous meme, mais bon...
 
Le probleme c'est chez moi je compte 6 ports ouvert en TCP, mais le programme ne m'en trouve qu'un et se termine.
 
Je debute en thread et en semaphore alors ca doit etre du a ca. Si je teste les 6 port un a un avec le programme de la version precedente (qui ne teste qu'un port) la reponse est correcte...
 
Question: le fait de detaché le thread signifie que si le pere meurt, le fils continera quand meme ?

n°907511
Joel F
Real men use unique_ptr
Posté le 25-11-2004 à 11:16:51  profilanswer
 

3xc4l18ur a écrit :

Je pensais qu'en vous donnant le code entier vous le testeriez et le constateriez par vous meme, mais bon...


 
on a que ca a faire tu vois [:dawa]

n°907553
3xc4l18ur
question = ( to ) ? be : ! be;
Posté le 25-11-2004 à 11:52:41  profilanswer
 

Joel F a écrit :

on a que ca a faire tu vois [:dawa]


 :na:  :na:  :na:

n°909669
3xc4l18ur
question = ( to ) ? be : ! be;
Posté le 28-11-2004 à 14:21:14  profilanswer
 

Bon bah je me suis dis qu'avec des mutexs ca irait mieu mais ca change rien
J'ai toujours qu'un seule reponse "Le port 21 est ouvert en TCP" alors que j'en ai carrement plus que ca :/
 
Je sais pas, y aurait il un temps limite entre 2 connexion sur une adresse ? peu probable...
 

Code :
  1. /*
  2. * Cette variante scanne tous les ports d'une adresse
  3. * Les ports ouverts en TCP sont logs dans un fichier
  4. * nomm adresse.txt
  5. * Les threads ecriront chacun leur tour dans le fichier
  6. * a l'aide d'une mutex
  7. */
  8. #include <stdio.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netdb.h>
  12. #include <string.h>
  13. #include <netinet/in.h>
  14. #include <unistd.h>
  15. #include <semaphore.h>
  16. #include <sys/stat.h>
  17. #include <fcntl.h>
  18. #define MAX_PORT 65536  /* Le nombre total port sur une adresse */
  19. pthread_mutex_t mut;     /*  Mutex servant a synchroniser l'ecriture dans le fichier*/
  20. FILE* fichier;               /* le descripteur du fichier ouvert */
  21. struct Data
  22. {
  23.   int socket_service;
  24.   struct sockaddr_in adr;
  25. };
  26. void* testConnexion(void* data)
  27. {
  28.   struct Data sock = *((struct Data*) data);
  29.   uint16_t port = ntohs(sock.adr.sin_port);
  30.  
  31.   /* Prise de la ressource */
  32.   pthread_mutex_lock(&mut);
  33.   /* Connexion au serveur */
  34.   if ((connect (sock.socket_service,(struct sockaddr *) &sock.adr, sizeof(struct sockaddr_in))) != -1)
  35.   {
  36.     printf("Le port %d est ouvert en TCP\n", port);
  37.     fprintf( fichier, "Le port %d est ouvert en TCP\n", port);
  38.   } 
  39.   //else
  40.   //printf("Le port %d est fermer en TCP\n", port);
  41.   /*  relache de la ressource */
  42.   pthread_mutex_unlock(&mut);
  43.  
  44.   pthread_exit(NULL);
  45. }
  46. main (int argc, char** argv)
  47. {
  48.   if (argc > 1)
  49.     {
  50.       struct Data sockData;
  51.       struct hostent* host;
  52.       int thread, i;
  53.       char*  mach_srv = "";
  54.       char* reponse;
  55.       mach_srv = argv[1];
  56.       /* mise en place du mutex avec les parametres par defaut */
  57.       pthread_mutex_init(&mut, NULL);
  58.                  
  59.       if ((sockData.socket_service = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
  60. {
  61.   perror("Creation socket impossible\n" );
  62.   exit(1);
  63. }
  64.      
  65.       if ((host = gethostbyname(mach_srv)) == NULL)
  66. {
  67.   perror ("Nom de l'hote inconnu\n" );
  68.   exit(1);
  69. }
  70.      
  71.       /* configuration de l'adresse */
  72.       bcopy(host->h_addr, &sockData.adr.sin_addr, host->h_length); /* bcopy(src, dest, lg) */
  73.       sockData.adr.sin_family = AF_INET;
  74.            
  75.       /**  
  76.        * creation du fichier a ecrire
  77.        * Si le fichier existe deja, il sera ecraser
  78.        */
  79.       char* nomfichier = argv[1];
  80.       strcat(nomfichier,".txt" );
  81.       fichier = fopen(nomfichier, "w" );
  82.       for(i = 0; i <= MAX_PORT; i++)
  83. {
  84.   sockData.adr.sin_port = htons(i);
  85.  
  86.   /*
  87.     Creation d'un nouveau thread s'excutant simultanment avec
  88.     son pere. Le nouveau thread execute la fonction "testConnexion"
  89.     avec l'argument sockData. La variable thread contient a present
  90.     le descripteur du thread.Le NULL peut etre remplac par des options
  91.   */
  92.   pthread_create ((pthread_t *) &thread, NULL, testConnexion, (void *) &sockData);
  93.   /* detachement du pere et du fils */
  94.   /* Sans ce detachement je ne pourrais pas faire plus de 255 threads simultanement */
  95.   pthread_detach(thread);
  96. }
  97.      
  98.       /* Attente du dernier thread */
  99.       pthread_join(thread, NULL);
  100.       pthread_mutex_destroy(&mut);
  101.       exit(0);
  102.     }
  103.   else
  104.     {
  105.       printf ("Vous devez taper qqch du genre :\n ./scanTCP1 127.0.0.1\n" );
  106.       exit(-1);
  107.     }
  108. }

n°909925
matafan
Posté le 28-11-2004 à 23:09:40  profilanswer
 

J'ai juste parcouru ton code donc je répond peut-être à coté, mais ça ne peut pas marcher en utilisant le même sockData pour tous tes threads. Fait des malloc() et utilise un sockData différent pour chaque thread.

n°909959
chrisbk
-
Posté le 29-11-2004 à 00:11:40  profilanswer
 

3xc4l18ur a écrit :

Je pensais qu'en vous donnant le code entier vous le testeriez et le constateriez par vous meme, mais bon...


 
ptain tu rigoles pas toi [:ddr555]
attends, bouge pas, jviens faire ton lacet, il est defait


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C/UNIX] tester les port ouvert en TCP

 

Sujets relatifs
[C/UNIX] *Resolu* Les threadsprogrammation port serie
Tomcat 4 : utiliser un port donné pour servir une webapp spécifiquetester une valeur et imprimer
Help !! Clié + recepteur sur un port ..[C/UNIX] Systeme de fichier
C sous Unix => Signaux pour une HorlogeSurveillance du port parallèle
port particulier pour une extension particulièretester l'existence d'un fichier sur le serveur [résolu]
Plus de sujets relatifs à : [C/UNIX] tester les port ouvert en TCP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR