Sockets mal fermés

cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 5 juillet 2006 - 26 juil. 2005 à 11:03
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Derniè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.

Merci @ vous

5 réponses

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 2
26 juil. 2005 à 11:33
closesocket(conf->sock);
shutdown(conf->sock, 2);

Marche pas mieux ?

+2(p - n)
0
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 5 juillet 2006
26 juil. 2005 à 11:48
hélas non j'ai tjs qques sockets en TIME_WAIT
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
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.
0
cs_poppyto Messages postés 540 Date d'inscription dimanche 29 décembre 2002 Statut Modérateur Dernière intervention 13 mai 2011
27 juil. 2005 à 07:57
Je dirais aussi que shutdown est à éviter dans tous les cas.
connect() & closesocket() du côté client ET serveur, ça roule :)

http://www.poppyto.net LE site pour les bassistes
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Derniè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
0