[C/UNIX] tester les port ouvert en TCP

tester les port ouvert en TCP [C/UNIX] - C - Programmation

Marsh Posté le 25-11-2004 à 00:18:42    

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
Reply

Marsh Posté le 25-11-2004 à 00:18:42   

Reply

Marsh Posté le 25-11-2004 à 00:21:28    

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

Reply

Marsh Posté le 25-11-2004 à 00:24:09    

C'est pour un tp !

Reply

Marsh Posté le 25-11-2004 à 02:44:07    

Si tu nous disais ce qui ne marche pas ?


Message édité par matafan le 25-11-2004 à 02:44:25
Reply

Marsh Posté le 25-11-2004 à 10:41:25    

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 ?

Reply

Marsh Posté le 25-11-2004 à 11:16:51    

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]

Reply

Marsh Posté le 25-11-2004 à 11:52:41    

Joel F a écrit :

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


 :na:  :na:  :na:

Reply

Marsh Posté le 28-11-2004 à 14:21:14    

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. }

Reply

Marsh Posté le 28-11-2004 à 23:09:40    

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.

Reply

Marsh Posté le 29-11-2004 à 00:11:40    

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

Reply

Sujets relatifs:

Leave a Replay

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