Sockets non-bloquants en receptions

shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013 - 29 déc. 2005 à 11:56
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 29 déc. 2005 à 17:30
Bonjour,

j'commence a me debrouiller avec les sockets non bloquants mais j'ai juste un probleme, j'essai de me faire un mailer anonyme donc je met dans mon case ID_ENVOYER (qui correspond a mon bouton envoyer un mail)

case ID_ENVOYER:
//on envoi la commande d'arrivée
sprintf(buffer,"helo smtp\r\n");
send(sock,buffer,sizeof(buffer),0);

pointeur = GetWindowTextLength(GetDlgItem(hwnd,ID_COMMENT)) + 1;
SendMessage(GetDlgItem(hwnd,ID_COMMENT),EM_SETSEL,pointeur,pointeur);
SendMessage(GetDlgItem(hwnd,ID_COMMENT),EM_REPLACESEL,TRUE,(LPARAM)buffer);

.... et ca continu pour MAIL FROM, RCPT TO ....

et j'ai mon case FD_READ, cependant quand le helo smtp s'affiche dans l'editbox on dirai que cela ne retourne rien, bref ma question est: est ce que le code dans le case FD_READ marche meme au fur et a mesure que cela fait les actions du case ID_ENVOYER,

8 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 13:38
sprintf(buffer,"helo smtp\r\n");
C'est quoi cette horreur, pourquoi pas strcpy??

A part ca j'a pas tout compris a ton problème
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 13:40
Au fait send(sock,buffer,sizeof(buffer),0);

Buffer est-il un tableau ou un pointeur? Tu pense pas que tu devrais plutot mettre strlen(buffer) plutot que sizeof buffer?
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
29 déc. 2005 à 14:43
En effet si buffer est un pointeur, sizeof va te renvoyer 4 qui correspond a la "taille" alloué pour un pointeur.
Au lieu de faire 15 fois GetDlgItem, déclare des variables globales pour les handles de tes controles et initialises les dans le WM_INITDILAOG.

Sinon soit plus précis sur ton pb car pour ma part j'ai pas bien saisi ou est le probleme ?

Le FD_READ est un événement généré a la reception de données sur une socket.
Il en va donc que si ta DlgProc bloque sur ton ID_ENVOYER, ton FD_READ serra en attente.

Shell
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
29 déc. 2005 à 14:49
bein le probleme c'est que lorsque je clic sur mon ID_ENVOYER il envoi les requetes a la suite, mais moi j'aimerai aussi qu'il puisse lire les messages renvoyés par le server smtp pour dire si la requetes est passé OK ou ERROR
0

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

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 14:53
Ben tu le fais avec recv non?
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
29 déc. 2005 à 17:14
ouai mais j'vai pas faire un recv() apres chaque send quand meme, ce que j'aurai voulu c'est ne gerer que les send et qu'il passe automatiquement par le FD_READ pour lire constamment ce qu'il se passe a n'importe quel moment

.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2005 à 17:18
Je pense que si, tu dois faire un recv après chaque send, ca me semble logique, c'est le principe du dialogue. Enfin je connais pas trop (pas du tout) les sockets, mais je suis quasiment sur que tu dois faire comme ca.
De plus, une lecture non bloquante je trouve ca bizarre...
Attendons que aardman passe dans le coin, il te conseillera mieux que moi
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 déc. 2005 à 17:30
Salut,

C'est plutot dans le FD_READ qu'il faut mettre le recv(), c'est le
message de notification qui est envoyé lorsque le buffer de reception
du socket contient des données.

Si tu recois 100 octets, et que dans le FD_READ tu en lis que 50, alors
tu recevra un nouveau FD_READ puisque le buffer du socket n'est
toujours pas vide.

[windows_sockets_error_codes_2.htm#winsock.wsaewouldblock_2 ]
0
Rejoignez-nous