Sockets non-bloquants en receptions

Signaler
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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?
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Ben tu le fais avec recv non?
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

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

.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
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 ]