begin process at 2012 05 30 05:58:37
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Prog C - Socket Windows ....


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Prog C - Socket Windows ....

lundi 19 avril 2004 à 00:48:28 | Prog C - Socket Windows ....

JimyRyan


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);
}
lundi 19 avril 2004 à 10:45:13 | Re : Prog C - Socket Windows ....

c2millet

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
lundi 19 avril 2004 à 23:00:28 | Re : Prog C - Socket Windows ....

JimyRyan

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....
mardi 20 avril 2004 à 09:52:26 | Re : Prog C - Socket Windows ....

c2millet

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


Cette discussion est classée dans : code, envoie, socket, sin, mysocket


Répondre à ce message

Sujets en rapport avec ce message

Probleme sockets de mer** [ par zzzzzz ] bé je suis plus quoi faire j'en suis toujours au meme prob y'en a 1 qui me dit d'utiliser strstr() l'autre strcmp() fin bref ca serrais sympas si quel Problème d'envoie par socket [ par CyberP ] J'ai fait un programme qui se connecte à un serveur ftp (le serveur ftp est aussi sur mon ordi). Je me connecte avec la fonction connect() et je recoi LERREUR QUI TUE §§§§§§§§§§§§§§§§ [ par Avalon10101 ] Vla jai fé mon prog tout é juste mais ya une erreur que je narrive vraiment pas à comprendre ! :C:\Documents and Settings\Alex\Mes documents\Makefile. pb socket [ par surfeurnet ] voici mon programme qui a pour l'instant pour unique but de se connecter à un serveur :# include # include # pragma comment (lib,"w32_32.lib")char ip, prob sock [ par epoc ] voilà, g commencé la prog des socks en vc++, mais rien ne transitte alors que la connexion semble être bien effectuée, voilà le code :**************** TimeOut sur un socket [ par djosh ] Voici un bout de code des sources du logiciel VNC, la fonction connect(). Mon but est de réduire le temps de réponse (message:"failed to connect to se Probleme de Client Serveur [ par Krox68 ] voila jaimerais faire un programme client qui puisse se connecter a ce serveur : #include void main(){ WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WS Probleme de sockets [ par MaDC ] J'ai fait ça, mais la reception ferme mon appli mfc sans raison... biens ur on ne reçoit rien... si qq1 pouvait m'éclairer se serait sympa de sa part Socket (getpeername) [ par petitchech ] Bonjour,Quand je fai sa sa me fai getpeername Esque quelqu'on peut m'aider ?if(getpeername(server,(struct sockaddr*) &adresse,&taille) printf("\n Erreur 10049 sur socket UDP [ par Ezekiel69 ] Salut tous le monde...Me voici depuis plusieurs jour confronté un a problème étrange.Je veux envoyer un message par l'intermédiaire d'un packet UDP su


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,680 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales