"An application must call the WSACleanup function for every successful time the WSAStartup function is called. This means, for example, that if an application calls WSAStartup three times, it must call WSACleanup three times. The first two calls to WSACleanup do nothing except decrement an internal counter; the final WSACleanup call for the task does all necessary resource deallocation for the task."
Si on suit leur logique, il est possible qu'un prog utilise deux librairies faisant chacune appel aux sockets. Par exemple utilisant une lib pour gérer tout ce qui est UDP et l'autre pour TCP. Selon les brillantes explications de msdn si chaque lib appelle wsastartup elle doit aussi faire cleanup. CQFD. Et si en plus le prog en question fais son wsastartup, ça fait trois.
Relire ce bordel me rappelle à quel point je hais l'implémentation des socket sur win32. Elle est tout sauf conforme à la spécification établie et correctement implémentée sur plus de 20 systèmes d'exploitations sauf windoze.
cs_Darksheep
Messages postés69Date d'inscriptionsamedi 4 novembre 2000StatutMembreDernière intervention15 septembre 2009 31 août 2007 à 20:55
Belle source :)
juste un truc katsankat :
si comme tu dit le role de WSAStartup est de vérifier la version de la dll,(Ce qui est vrai )
et qu'on doit l'appeller une seule fois au début du programme,
Alors appeller autant de fois WSACleanup() ne revient il pas à ne l'appeller qu'une fois à la fin ?
dans ce cas pourquoi spécifier qu'on doit appeller autant de fois WSACleanup que WSAStartup si on ne l'appelle qu'une fois ?C'est bête XD
KissyFroth
Messages postés38Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention 7 avril 2007 22 avril 2006 à 16:39
Bon normalement la plupart des erreurs sont résolues, le programme ne gère pas l'envoi à plusieurs utilisateurs et je n'ai aucune idée du pourquoi, lors de certains envois, la taille des pièces jointes apparait à 0 octets. (mais bon tant que dans le contenu elles sont intactes c'est le principal non ?)
Biroto
Messages postés11Date d'inscriptionjeudi 10 octobre 2002StatutMembreDernière intervention15 avril 2006 15 avril 2006 à 13:46
oula dsl comme je disais jai la tete ds le cul lol
jai dit nimporte quoi
mais essayes de mettre
while( !buf[0] )
int yeah = recv( to_server_socket, buf, 1024, 0 );
buf[yeah]=0
enfin ma remarque nest surement pas tres pertinente vu que j'ai pas lu la suite du code
Biroto
Messages postés11Date d'inscriptionjeudi 10 octobre 2002StatutMembreDernière intervention15 avril 2006 15 avril 2006 à 13:43
je n'ai pas eu le courage de lire tout ton code, je viens juste de me réveiller jai la tete ds le cul :p
mais j'ai vu que tu parlais du recv donc je suis allé voir
A mon avis la avec ce que ta mi tu ne sors jamais de la boucle while( !buf[0] )
essayes de remplacer
while( !buf[0] )
int yeah = recv( to_server_socket, buf, 1024, 0 );
ketchupy45
Messages postés101Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention13 décembre 20071 20 mars 2006 à 18:34
Bonjour, est ce normal que lors de l'envoi de pieces jointes la taille de celle ci apparait a 0 Ko à la réception?
Est ce que l'envoi a plusieurs utilisateurs est géré?
wxccxw
Messages postés755Date d'inscriptionsamedi 15 mai 2004StatutMembreDernière intervention30 janvier 2011 11 févr. 2006 à 12:27
PS : Je n'est pas voter :) je met 9/10
wxccxw
Messages postés755Date d'inscriptionsamedi 15 mai 2004StatutMembreDernière intervention30 janvier 2011 8 févr. 2006 à 12:44
moi j'aprouve SMTP.WANADOO.FR 25
KissyFroth
Messages postés38Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention 7 avril 2007 11 janv. 2006 à 01:26
Au cas ou vous ne l'auriez pas remarqué voici une petite liste de serveurs smtp
que j'ai rajouté à la fin de mon prog
Les serveurs marqués de * sont testés et approuvés pour mon prog.
KissyFroth
Messages postés38Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention 7 avril 2007 10 janv. 2006 à 17:10
Tu as certainement raison au niveau de la programmation et j'ai corrigé mon programme
comme tu me le conseillais. (en fait je ne connaissais pas le role de WSAStartup : maintenant
je saurais)
Cependant, comme il fallait s'y attendre le bug ne vient pas de là.
En fait le programme plante quand il se produit une erreur lors de l'envoi. Je soupconne que
ca vient de la fonction "recv" qui plante. J'ai deja essayé d'arreter la boucle d'envoi lorsqu'une
reponse indiquait une erreur mais ca n'a rien fait.Donc l'erreur se produit dans la fonction "Process".
Mais ou ?
katsankat
Messages postés571Date d'inscriptionvendredi 30 décembre 2005StatutMembreDernière intervention12 juillet 20123 10 janv. 2006 à 16:33
Le rôle de WSAStartup() est de vérifier la version de la dll, se fait une seule fois au début du programme.
Aussi -toujours spécifique à win32- la fonction WSAcleanup libère la dll: msdn dit qu'on doit l' appeler pour libérer les ressources de l' application. msdn dit aussi qu'on doit appeler wsacleanup autant de fois qu'on a appelé wsastartup, ton bug pourrait venir de là -sans confirmation de ma part.
Tu peux placer les deux dans ton point d'entrée:
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE a, PSTR b, int v)
{
if( int err = WSAStartup( 0x0202, &wsaData ) ) //et pas 0x0101 puisque ws2_32
{
MessageBox (NULL, TEXT ("dll winsock 2 non trouvée"), NULL, NULL);
return 0;
}
DialogBoxParam(hinst, (LPCTSTR)PAGE, 0, AppDlgProc, 0);
WSACleanup();
return 0;
}
KissyFroth
Messages postés38Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention 7 avril 2007 10 janv. 2006 à 12:31
Voilà c'est corrigé. J'en profite pour apporter 2 petites précisions : j'ai fait cette source avec VC++ 6 et N'OUBLIEZ PAS D'INCLURE ws2_32.lib dans PROJECT->SETTINGS->LINK->Objects/Library Modules
sinon la compilation ne marchera pas.
ketchupy45
Messages postés101Date d'inscriptiondimanche 1 mai 2005StatutMembreDernière intervention13 décembre 20071 10 janv. 2006 à 11:37
Salut Il serait bien que tu mette le zip avec tes fichiers de codes.
2 sept. 2007 à 11:37
Thx for your answer
31 août 2007 à 23:10
Pas si bête que ça d'ailleurs. Sans équivoque, c'est dit ici:
http://msdn2.microsoft.com/en-us/library/ms742213.aspx
"An application must call the WSACleanup function for every successful time the WSAStartup function is called. This means, for example, that if an application calls WSAStartup three times, it must call WSACleanup three times. The first two calls to WSACleanup do nothing except decrement an internal counter; the final WSACleanup call for the task does all necessary resource deallocation for the task."
Si on suit leur logique, il est possible qu'un prog utilise deux librairies faisant chacune appel aux sockets. Par exemple utilisant une lib pour gérer tout ce qui est UDP et l'autre pour TCP. Selon les brillantes explications de msdn si chaque lib appelle wsastartup elle doit aussi faire cleanup. CQFD. Et si en plus le prog en question fais son wsastartup, ça fait trois.
Relire ce bordel me rappelle à quel point je hais l'implémentation des socket sur win32. Elle est tout sauf conforme à la spécification établie et correctement implémentée sur plus de 20 systèmes d'exploitations sauf windoze.
31 août 2007 à 20:55
juste un truc katsankat :
si comme tu dit le role de WSAStartup est de vérifier la version de la dll,(Ce qui est vrai )
et qu'on doit l'appeller une seule fois au début du programme,
Alors appeller autant de fois WSACleanup() ne revient il pas à ne l'appeller qu'une fois à la fin ?
dans ce cas pourquoi spécifier qu'on doit appeller autant de fois WSACleanup que WSAStartup si on ne l'appelle qu'une fois ?C'est bête XD
22 avril 2006 à 16:39
15 avril 2006 à 13:46
jai dit nimporte quoi
mais essayes de mettre
while( !buf[0] )
int yeah = recv( to_server_socket, buf, 1024, 0 );
buf[yeah]=0
enfin ma remarque nest surement pas tres pertinente vu que j'ai pas lu la suite du code
15 avril 2006 à 13:43
mais j'ai vu que tu parlais du recv donc je suis allé voir
A mon avis la avec ce que ta mi tu ne sors jamais de la boucle while( !buf[0] )
essayes de remplacer
while( !buf[0] )
int yeah = recv( to_server_socket, buf, 1024, 0 );
par
while( !buf[0] )
{
int yeah = recv( to_server_socket, buf, 1024, 0 );
buf[yeah]=0;
}
salut
20 mars 2006 à 18:34
Est ce que l'envoi a plusieurs utilisateurs est géré?
11 févr. 2006 à 12:27
8 févr. 2006 à 12:44
11 janv. 2006 à 01:26
que j'ai rajouté à la fin de mon prog
Les serveurs marqués de * sont testés et approuvés pour mon prog.
///////////////////////////////////////////
// Serveurs SMTP //
// smtp.laposte.net
// smtp.ifrance.com
// smtp.mail.yahoo.fr
// * smtp.neuf.fr
// * smtp.cegetel.net
// mail.club-internet.fr
// smtp.wanadoo.fr
10 janv. 2006 à 17:10
comme tu me le conseillais. (en fait je ne connaissais pas le role de WSAStartup : maintenant
je saurais)
Cependant, comme il fallait s'y attendre le bug ne vient pas de là.
En fait le programme plante quand il se produit une erreur lors de l'envoi. Je soupconne que
ca vient de la fonction "recv" qui plante. J'ai deja essayé d'arreter la boucle d'envoi lorsqu'une
reponse indiquait une erreur mais ca n'a rien fait.Donc l'erreur se produit dans la fonction "Process".
Mais ou ?
10 janv. 2006 à 16:33
Aussi -toujours spécifique à win32- la fonction WSAcleanup libère la dll: msdn dit qu'on doit l' appeler pour libérer les ressources de l' application. msdn dit aussi qu'on doit appeler wsacleanup autant de fois qu'on a appelé wsastartup, ton bug pourrait venir de là -sans confirmation de ma part.
Tu peux placer les deux dans ton point d'entrée:
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE a, PSTR b, int v)
{
if( int err = WSAStartup( 0x0202, &wsaData ) ) //et pas 0x0101 puisque ws2_32
{
MessageBox (NULL, TEXT ("dll winsock 2 non trouvée"), NULL, NULL);
return 0;
}
DialogBoxParam(hinst, (LPCTSTR)PAGE, 0, AppDlgProc, 0);
WSACleanup();
return 0;
}
10 janv. 2006 à 12:31
sinon la compilation ne marchera pas.
10 janv. 2006 à 11:37