cs_fredo2009
Messages postés17Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention 5 juillet 2006
-
19 juil. 2005 à 20:21
cs_fredo2009
Messages postés17Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention 5 juillet 2006
-
20 juil. 2005 à 18:55
Salut@tous
Voilà la fonction que j'utilise pour savoir si un port est ouvert sur une ip:
DWORD WINAPI connection( LPVOID Param )
{
struct config * conf = (struct config *)Param;
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
conf->sin.sin_addr.s_addr = ntohl(conf->ip);
conf->sin.sin_family = AF_INET;
conf->sin.sin_port = ntohs(conf->port);
conf->sock = socket(AF_INET,SOCK_STREAM,0);
bind(conf->sock, (SOCKADDR *)&conf->sin, sizeof(conf->sin));
if ( !connect(conf->sock, (SOCKADDR *)&conf->sin, sizeof(conf->sin)) )
{
FILE * fic;
char retour[] = "\n";
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
/* Ecrire chaîne dans le fichier */
fwrite(inet_ntoa(conf->sin.sin_addr), strlen(inet_ntoa(conf->sin.sin_addr)), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
}
nthread++;
closesocket(conf->sock);
WSACleanup();
CloseHandle(conf->hthread);
free(conf);
}
Mais dans le cas de mon scanner multithread basé sur le code :
http://www.cppfrance.com/code.aspx?ID=28177 J'obtiens un cpu 100%
J'imagine qu'il y a d'autres façon de savoir si un port est ouvert
J'espère que quelqu'un pourra me dire ce qui est à l'origine de cette surconsommation de ressources.
Je pense que c'est là que je dois intervenir:
bind(conf->sock, (SOCKADDR *)&conf->sin, sizeof(conf->sin));
if ( !connect(conf->sock, (SOCKADDR *)&conf->sin, sizeof(conf->sin)) )
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 19 juil. 2005 à 23:41
Salut,
Dans ma source j'utilise l'api GetTcpTable(), fonction qui ne
permet pas d'obtenir le PID du processus qui a ouvert le port (ca peut
etre utile).
Cosmobob a posté une source plus récente qui permet de faire cela:
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 20 juil. 2005 à 11:00
Le probleme des threads c'est que justement il te bouffe des ressources processeurs en + de ton programme et il faut savoir que les connexions reseaux sa peut etre super lourd a gerer.... Tu utilise toujours 100 threads a la fois ?? parce que si c'est le cas, cherche pas plus loin.... faudrait revoir le nombre de tread a la baisse au t'acheter une tour 4 proce bi-xeon avec hyperthreading et 10 go de ram ... lol
Non serieux, j'ai un p4 2,8e (o/c @ 3.33) et meme avec l'hyperthreading, j'ai certain programme qui utilise 2 threads et je grimpe deja a 50 % (si j'avais pas l'HT je serais a 100 %). Donc pour finir, mon conseil serai de baisser le nombre de thread et de les optimiser a fond.
@++
"Avant même de fonctionner, tout programme est déjà obsolète."
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_fredo2009
Messages postés17Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention 5 juillet 2006 20 juil. 2005 à 11:31
Quand je compare mon prog avec un autre genre scan100.exe( c'est un scanner 100 thread, il existe aussi en version 500 et 1000), ça me bouffe que dalle en ressource, j'atteind même pas les 2% du CPU.
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 20 juil. 2005 à 11:54
La je t'avoue que je comprend pas non-plus...Un truc que j'avais pas remarquer au debut et que je ne sais pas si tu la modifier c'est la facon de fermer ton thread... tu utilise toujours CloseHandle(conf->hthread) ? parce que comme la dit BruNews, cela ne fait que cacher ton thread. A tu essayer terminatethread() ? Sinon j'imagine qu'en fait, meme la tache du thread termine, il doit rester en memoire .... ce qu'y fait qu'au final, 100 threads en memoire qui tourne pour rien .... c'est gore !!!
Je te conseil d'aller voir la msdn(je sais c'est lourd comme site mais c'est utile).
Tiens j'ai fait une petite recherhce vite fait. Va sur
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/terminatethread.asp En esperant que ca te soit utile.
@++
"Avant même de fonctionner, tout programme est déjà obsolète."
cs_fredo2009
Messages postés17Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention 5 juillet 2006 20 juil. 2005 à 12:42
Oui j'étais en train de voir ça!
Sinon j'ai essayé WaitForSingleObject
Ca marche, ça ne consomme presque plus rien, mais ça m'a méchement ralentit mon scanner!
On est sur la bonne voix!!!
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 20 juil. 2005 à 16:03
Donc WaitForSingleObject est une sorte de timer avant fermeture du thread ??? Y'aurais pas moyen de modifier le temps d'attente ?? (genre une structure ou un parametre dans le genre ??? )
"Avant même de fonctionner, tout programme est déjà obsolète."
cs_fredo2009
Messages postés17Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention 5 juillet 2006 20 juil. 2005 à 17:01
si j'enlève le ; le prog se lance et se termine aussitot
J'ai aussi pensé à fermer le handle du thread apres WaitForSingleObject.
Mais ça ne change rien, avec WaitForSingleObject il rame comme c'est pas possible!
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 20 juil. 2005 à 17:02
Pour le timer de WaitForSingleObject j'ai trouve la fonction suivante DWORDWaitForSingleObjectEx( HANDLE[ hHandle],
DWORD[ dwMilliseconds],
BOOL[ bAlertable] );
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 20 juil. 2005 à 17:53
Salut,
Enleve le ; apres le while, ca te fait une boucle infinie.
Ensuite, je comprend pas l'interet de faire un thread si tu colle un
WaitForSingleObject juste apres pour attendre la fin de l'execution du
thread..
Faudrait plutot incrementer une variable a chaque thread qui se lance,
décrementer cette variable a chaque thread qui se termine, e tu ne
quitte le prog que lorsque tout les threads ont fini leur boulot.