2012-06-02 5 views
0

J'ai fait un simple programme de scanner de port C sous Linux. L'algorithme principal est try appel connect, s'il renvoie -1, je n'ai pas pu me connecter, sinon j'ai connecté l'hôte. Cela fonctionne très bien dans mon ordinateur, il répertorie mes ports ouverts. Cependant, dans ma maison il y a un autre ordinateur (derrière le même routeur avec le mien) et je donne son adresse IP mais le programme se bloque. J'ai essayé google.com, facebook.com ou tout autre site Web et ils ne répondent même pas à la première demande. Qu'est-ce que je fais mal?Scanneur de port en C++ se bloque

EDIT:

for(port=0; port<=65536; port++) 
{ 
    struct sockaddr_in addr;   
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(port); 
    addr.sin_addr = *((struct in_addr *)he->h_addr); 
    memset(&(addr.sin_zero), '\0', 8); 
    if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) { 
     printf("%i closed\n", port); 
     close(sockfd); 
    } 
    else { 
     printf("%i open\n", port); 
     close(sockfd); 
    } 
} 
+0

Il est presque impossible de dire sans regarder le code, j'ai peur. –

+0

Avez-vous essayé d'attendre 60 secondes? Ou quelle que soit la valeur du délai d'expiration par défaut? –

+0

En outre, 'port <65536'. –

Répondre

2

Par défaut connect bloquera pendant une période avant de retourner une erreur. Vous pouvez choisir un délai d'attente plus court en réglant le socket sur le mode non bloquant puis en appelant la connexion puis select avec un délai d'attente.

Il y a beaucoup d'exemples de ceci. Ce tutoriel sur les sockets nonblocking est assez clair. Ou voir OsNetworkConnect pour un exemple que j'ai écrit précédemment.

Vos tentatives de connexion à des ports arbitraires sur des sites externes peuvent être délibérément bloquées (par les administrateurs sys décourageant les scanners de ports!).

Notez également que vos conditions de boucle sont légèrement décalées. Vous devez terminer au port 65535. 65536 ne peut pas être représenté en 16 bits.