cs_fredo2009
Messages postés17Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention 5 juillet 2006
-
26 juil. 2005 à 11:03
cs_fredo2009
Messages postés17Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention 5 juillet 2006
-
27 juil. 2005 à 10:21
Salut @ tous!!!
Petit à petit mon scanner de port prend forme, j'en suis à la partie optimisation. La plus chiante j'ai l'impression d'ailleurs! lol
Donc voilà ce que je fais:
for (;!connect(conf->sock, (SOCKADDR *)&conf->sin, sizeof(conf->sin));)
{
shutdown(conf->sock,2);
/* Ecrire chaîne dans le fichier */
freopen ("resultats.dat","a",stdout);
printf("%s\n",inet_ntoa(conf->sin.sin_addr));
fclose (stdout);
//CloseHandle(conf->hthread);
}
En gros, si la connection est établie, je la ferme et j'écrit dans un fichier l'ip ou j'ai pu me connect sue le port voulu.
Une fois le scan fini, je fais un netstat -n histoire de vérifier que toutes les connexions sont bien fermées!
Et là malheur, je vois:
TIME_WAIT
Certains sockets n'ont pas pu se fermer et sont en attente.
J'ai lu quelquepart que shutdown était mieux que CloseHandle.
Mais ça change que dalle!
Est-ce qu'il y a une autre commande plus efficace?
Pendant que j'y suis, je me demande aussi si connect est la meilleur solution pour vérifier qu'un server est online.
Car dans le cas d'un scanner multithread, ça arrive à manger pas mal de ressource system.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 26 juil. 2005 à 15:13
Salut,
Pour fermer un socket il faut utiliser closesocket() et pas
CloseHandle() ni shutdown() (shutdown pouvant etre utilisé avant
closesocket() pour fermer proprement la connexion mais il le libere pas
les ressources du socket).
Ensuite, le status tcp TIME_WAIT ne veut pas forcement dire que tu a
oublié de fermer des connexions (je m'y fierai pas personnelement).
Enfin, faire des connect() en boucle dans des threads c'est sur que
c'est pas la meilleure technique car connect etablie une connexion tcp
complete, c'est a dire qu'il utilise 3 paquets pour etablir la
connexion, alors que pour savoir si un port est ouvert ou fermé il n'en
faudrait qu'un...
Regarde dans les sources de _sebf pour en savoir un peu plus sur ce genre de technique.
cs_fredo2009
Messages postés17Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention 5 juillet 2006 27 juil. 2005 à 10:21
Je vous remercie de vos réponses!
Je suis également d'avis que connect est un peu trop bourrin juste pour savoir si un port est ouvert!
Dans ce lien source de _SebF je pense trouver quelque chose de mieux:
http://www.frameip.com/tcpping/
Car si je peux éviter de me connect ça résoudra le problème de fermeture et de time_wait
J'ai essayé toutes les combinaisons possibles de closesocket() et de shutdown(). Pour du multithread c pas le top