Prog C / SMTP /SOCKET win- Problème d'envoie de piece jointe

 
Poster un nouveau sujet   Répondre au sujet    iprelax.fr Index du Forum -> SMTP
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
JimyRyan
dummy mioche
dummy mioche


Inscrit le: 19 Avr 2004
Messages: 1

MessagePosté le: Lun Avr 19, 2004 10:41 pm    Sujet du message: Prog C / SMTP /SOCKET win- Problème d'envoie de piece jointe Répondre en citant

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);
}
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    iprelax.fr Index du Forum -> SMTP Toutes les heures sont au format CET (Europe)
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum
Affilzen SARL : Mention légale