JimyRyan dummy mioche

Inscrit le: 19 Avr 2004 Messages: 1
|
Posté le: Lun Avr 19, 2004 10:41 pm Sujet du message: Prog C / SMTP /SOCKET win- Problème d'envoie de piece jointe |
|
|
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);
} |
|