Socket 100% CPU

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

17 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
19 juil. 2005 à 20:33
Regarde ici:
http://www.cppfrance.com/code.aspx?ID=11370

ciao...
BruNews, MVP VC++
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
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:

http://www.cppfrance.com/code.aspx?ID=24984
0
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 5 juillet 2006
20 juil. 2005 à 10:23
en fait je me demande si c'est pas plutot la fonction thread qui poserait problème.
Car même avec un thread de 1 ça monte à fond mon CPU

for (;startip <= endip;startip++)
{
while ( !nthread );
{
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = startip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);
nthread--;
}
}
0
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Derniè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."
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
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.

Là je sèche!
0
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Derniè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."

Jean84 allias Ion@ce
Webmaster de http://www.latriyade.com
0
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Derniè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!!!

for (;startip <= endip;startip++)
{
while ( !nthread );
{
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = startip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);
WaitForSingleObject((conf->hthread),1000);
nthread--;
}
}
0
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
20 juil. 2005 à 15:26
Je connais pas du tout cette fonction. C'est quoi le but au juste ??? J'ai pas compris pour la fonction therminatethread()... t'as teste ou pas ??

"Avant même de fonctionner, tout programme est déjà obsolète."
0
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 5 juillet 2006
20 juil. 2005 à 15:58
Bon, j'ai test ça:

TerminateThread(conf->hthread, 0);
WaitForSingleObject((conf->hthread),200);
ExitThread(0);

D'après ce que j'ai compris, WaitForSingleObject attend (ici 200ms) avant de fermer le thread.

TerminateThread et ExitThread n'ont rien changé à mon problème.
WaitForSingleObject fonctionne mais le prog est ralenti!
0
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Derniè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."
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
20 juil. 2005 à 16:39
Salut,

for (;startip <= endip;startip++)

{


while ( !nthread );

{

conf = (struct config *) malloc(sizeof(struct config) );

conf->ip = startip;

conf->port = port;

conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);

WaitForSingleObject((conf->hthread),1000);

nthread--;

}

}



Le point virgule apres le while ( !nthread ); serait pas de trop ?

Pense aussi a fermer le handle du thread apres WaitForSingleObject.
0
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Derniè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!

for (;startip <= endip;startip++)
{
while ( !nthread );
{
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = startip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);
closesocket(conf->sock);
CloseHandle(conf->hthread);
nthread--;
}
}
0
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
20 juil. 2005 à 17:02
Pour le timer de WaitForSingleObject j'ai trouve la fonction suivante DWORD WaitForSingleObjectEx(
HANDLE [ hHandle],
DWORD [ dwMilliseconds],
BOOL [ bAlertable]
);

sur http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobjectex.asp. Peut etre qu'au niveau des perfs, si tu mets 0 sa devrait aller un peu mieux .....

"Avant même de fonctionner, tout programme est déjà obsolète."
0
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 5 juillet 2006
20 juil. 2005 à 17:39
Ca semble beaucoup mieux qd je met le WaitForSingleObject juste apres la boucle while.

for (;startip <= endip;startip++)
{
while ( !nthread );
{
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = startip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);
nthread--;
}
WaitForSingleObject((conf->hthread),30);
CloseHandle(conf->hthread);
}
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
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.
0
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 5 juillet 2006
20 juil. 2005 à 18:47
J'ai essayé ça!
Ca m'affiche 10x fois la même ip scanné

for (;startip <= endip;startip++)
{
nthread = atoi(argv[4]);
while ( nthread>0 )
{
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = startip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);
nthread--;
}
CloseHandle(conf->hthread);
}
0
cs_fredo2009 Messages postés 17 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 5 juillet 2006
20 juil. 2005 à 18:55
Je corrige ma boulette!
Mais tjs grosse consommation de cpu

for (;startip <= endip;)
{
nthread = atoi(argv[4]);
while ( nthread>0 )
{
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = startip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);
nthread--;
startip++;
}
CloseHandle(conf->hthread);
}
0