3xc4l18ur question = ( to ) ? be : ! be; | 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 :
- /*
- * Cette variante scanne tous les ports d'une adresse
- * Les ports ouverts en TCP sont loggs dans un fichier
- * nomm adresse.txt
- * Les threads ecriront chacun leur tour dans le fichier
- * a l'aide d'une semaphore
- */
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
- #include <string.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <semaphore.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #define MAX_PORT 65536 /* Le nombre total port sur une adresse */
- static sem_t fichierDispo; /* semaphore qui va coordonne l'ecriture dans le fichier */
- FILE* fichier; /* le descripteur du fichier ouvert */
- struct Data
- {
- int socket_service;
- struct sockaddr_in adr;
- };
- void* testConnexion(void* data)
- {
- struct Data sock = *((struct Data*) data);
- uint16_t port = ntohs(sock.adr.sin_port);
-
- /* prise de la ressource P(1)*/
- sem_wait(&fichierDispo); //bloquant si la ressource n'est pas libre
- /* Connexion au serveur */
- if ((connect (sock.socket_service,(struct sockaddr *) &sock.adr, sizeof(struct sockaddr_in))) != -1)
- {
- printf("Le port %d est ouvert en TCP\n", port);
- fprintf( fichier, "Le port %d est ouvert en TCP\n", port);
- }
- /* relache de la ressource V(1)*/
- sem_post(&fichierDispo);
-
- pthread_exit(NULL);
- }
- main (int argc, char** argv)
- {
- if (argc > 1)
- {
- struct Data sockData;
- struct hostent* host;
- int thread, i;
- char* mach_srv = "";
- char* reponse;
- mach_srv = argv[1];
- /* mise en place de la semaphore */
- 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
-
- if ((sockData.socket_service = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
- {
- perror("Creation socket impossible\n" );
- exit(1);
- }
-
- if ((host = gethostbyname(mach_srv)) == NULL)
- {
- perror ("Nom de l'hote inconnu\n" );
- exit(1);
- }
-
- /* configuration de l'adresse */
- bcopy(host->h_addr, &sockData.adr.sin_addr, host->h_length); /* bcopy(src, dest, lg) */
- sockData.adr.sin_family = AF_INET;
-
- /**
- * creation du fichier a ecrire
- * Si le fichier existe deja, il sera ecraser
- */
- char* nomfichier = argv[1];
- strcat(nomfichier,".txt" );
- fichier = fopen(nomfichier, "w" );
- for(i = 0; i <= MAX_PORT; i++)
- {
- sockData.adr.sin_port = htons(i);
-
- /*
- Creation d'un nouveau thread s'excutant simultanment avec
- son pere. Le nouveau thread execute la fonction "testConnexion"
- avec l'argument sockData. La variable thread contient a present
- le descripteur du thread.Le NULL peut etre remplac par des options
- */
- pthread_create ((pthread_t *) &thread, NULL, testConnexion, (void *) &sockData);
- /* detachement du pere et du fils */
- pthread_detach(thread);
- }
-
- exit(0);
- }
- else
- {
- printf ("Vous devez taper qqch du genre :\n ./scanTCP1 127.0.0.1\n" );
- exit(-1);
- }
- }
|
edit: Quelque changement dans le code, mais toujours le meme probleme Message édité par !cricri le 25-11-2004 à 10:55:35
|