Prog C - Socket Windows ....

JimyRyan Messages postés 9 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 19 avril 2004 - 19 avril 2004 à 00:48
c2millet Messages postés 198 Date d'inscription lundi 2 juin 2003 Statut Membre Dernière intervention 15 février 2005 - 20 avril 2004 à 09:52
Bonjour.

Je suis sur le point de finir un programme d'envoie de mail automatique avec pièce jointe.

Mon problème est le suivante :

Lors de l'envoie de la pièce jointe, mon socket (bloquant) n'attend pas que toute les données (variable celon la taille de la pièce jointe) soit parvenues au serveur de courrier pour cloturer la transaction (envoie de "." pour cloturer le champ DATA, puis "QUIT" pour indiquer que la composition du mail est terminée).

Pour le moment j'ai trouver une solution : utiliser un Sleep pour que les données est le temps d'êtres transmisent avant la cloturation du mail.

Cependant cette méthode marche si auqu'un trafic n'est présent lors de l'envoie, si un upload est en court, mon Sleep ne colle plus a ma Bande passante disponnible pour l'envoie.

Si quelqu'un aurais une idee...

Voici mon code :

Détailes sur mon socket
//parametrage du socket
WSAStartup(MAKEWORD(2,0), &WSAData);//initialise le socket (indique la version utilisee,...)
sin.sin_addr.s_addr	= inet_addr(IPServer);//adresse IP du server a joindre
sin.sin_family		= AF_INET;//protocole IP
sin.sin_port		= htons(25);//le N° de port du server ou l'on va ce connecter
mySocket = socket(AF_INET,SOCK_STREAM,0);//SOCK_STREAM : ouvrent une conn entre les 2 ordinateurs directe et pourra ensuite envoyer les paquets que vous désirez
//Paramétrage de la socket
setsockopt(mySocket,SOL_SOCKET,SO_DONTLINGER,(char*)0,sizeof(0));
bind(mySocket, (SOCKADDR *)&sin, sizeof(sin));//lie le socket a l'adresse et au N° de port definit plus haut
//connexion au server
strcpy(reponceServer,"\0");
connect(mySocket, (SOCKADDR *)&sin, sizeof(sin));//la connexion avec le server et etablie apres cette ligne
if (recv(mySocket,reponceServer,200,0) > 20)
        printf("\nConnexion etablie\n");
//rend le socket non bloquant
ioctlsocket(mySocket,FIONBIO,&ioctl_blocking);


Dans Envoie de la pièce joint (donnee_A_Transmetre) encode en base 64 - fonction non montrée ici; On voix ici le Sleep qui est basé sur 10KO/sec => si un peu de trafic existe les 10KO/Sec ne sont plus disponibles, le temps d'attente n'est pas asser long => le mail ne sera pas valide.
Process(donnee_A_Transmetre,mySocket,tailleFichierAEnvoyer);
Sleep((tailleFichierAEnvoyer/10000)*1000);//vitess de tranmission : 10KO/Sec sens up


Ma fonction d'envoie dans mon socket.
//donner a trenmetre, nom du socket, reponce du server attendu
void Process(char *donneeATransmettre,SOCKET mySocket,unsigned long tailleDesDonnee)
{ //la variable taulleDesDonnee est tjs a 0 sauf que on envoie le fichier 
 unsigned long sizeP = strlen(donneeATransmettre);
 unsigned long retVal; 
 int reponceServer_OctetRecu = 0;
 char reponceServer[21];
 
 //Besoin d'une pause pour les gros fichiers
 if(tailleDesDonnee >= 51200) Sleep(2000);
 if(!tailleDesDonnee)retVal = send(mySocket,donneeATransmettre,sizeP,0);
 else retVal = send(mySocket,donneeATransmettre,tailleDesDonnee,0);
 
//si on envoie avant la reponce du server, le mail ne peut pas etre envoyer reponceServer_OctetRecu recv(mySocket,reponceServer,20,0);//20> lit 20 octets 
 
 while (reponceServer_OctetRecu == 0)
Sleep(1);
}

3 réponses

c2millet Messages postés 198 Date d'inscription lundi 2 juin 2003 Statut Membre Dernière intervention 15 février 2005
19 avril 2004 à 10:45
Je pense que si tu mettait une boucle while sur ton "recv"ça marcherait mieux. ;-)
Tant que tu napas reçu de réponse du serveur tu fait ton "recv"
N'oubli de mettre un time out car en cas de pb avec le serveur ton appli sera bloqué

Cmill
0
JimyRyan Messages postés 9 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 19 avril 2004
19 avril 2004 à 23:00
Je ne peut utiliser ton conseil car le serveur SMTP (par exemple smtp.wanadoo.fr) dans le cas ou il se trouve dans le champ DATA, ne renvoie auqun'une information a mon client. Le serveur SMTP répond une fois le "." de fin envoie. or entre la fin de la transaction de l'envoie des données de la pièces jointe et le "." je doit envoyer d'autres information....
0
c2millet Messages postés 198 Date d'inscription lundi 2 juin 2003 Statut Membre Dernière intervention 15 février 2005
20 avril 2004 à 09:52
J'ai essayé en session telnet le data me revoit bien qq chose pour wanadoo. J'ai moi mm réalisé un envoie d'email-auto qui reçoit bien le retour du serveur a l'envoie de data. Mais il me renvoi une erreur.Mais je pense que cela vient du fait que ce n'est po mon fournisseur.
Voilà peu po t'aidé plus........ :-/

Essaie en session telnet si ça te renvoi qq chose pour data(ce qui serait logique) ça vient de ton appli

Cmill
0
Rejoignez-nous