IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Client socket UDP


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Par défaut Client socket UDP
    Bonjour à toutes et à tous!
    Voilà je voudrait que mon application puisse envoyer un mail grâce à une connexion socket. Je doit me connecter au serveur smtp de l'académie de grenoble qui n'autorise que les connexion UDP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    
    int main (int argc, char *argv[])
    {
    // ********************************************************
    // Déclaration des variables
    // ********************************************************
    	WSADATA initialisation_win32; // Variable permettant de récupérer la structure d'information sur l'initialisation
    	int erreur=1,sockDesc; // Variable permettant de récupérer la valeur de retour des fonctions utilisées
    	struct sockaddr_in maSock;
    	char* address=new char[30];
    	char* message=new char[2048];
    	char* corpMess=new char[1024];
    	memset(&maSock, 0, sizeof(sockaddr_in));
    // ********************************************************
    // Initialisation de Winsock
    // ********************************************************
    	erreur=WSAStartup(MAKEWORD(2,0),&initialisation_win32);
    	if (erreur!=0)
    		  cout<<"Desole, je ne peux pas initialiser Winsock du a l'erreur : "<<erreur<<WSAGetLastError()<<endl;
    	else
    		  cout<<"WSAStartup  : OK"<<endl;
    // ********************************************************
    // Initialisation de la structure sockaddr_in
    // ********************************************************
    	address="194.54.149.19";
    	maSock.sin_family= AF_INET;
    	maSock.sin_port=htons(25);
    	maSock.sin_addr.s_addr=inet_addr(address);
    // ********************************************************
    // Création de la socket
    // ********************************************************
    	sockDesc = socket(AF_INET, SOCK_DGRAM, 0/*IPPROTO_UDP*/);
    	if (sockDesc < 0) /* error */
    		cout<<"erreur lors de la création de la socket"<<endl;
    // ********************************************************
    // Nommage de la socket (facultatif)
    // ********************************************************
    	erreur=bind(sockDesc, (struct sockaddr*)&maSock, sizeof((struct sockaddr*)&maSock));
    	if(erreur<0) cout<<"Echec lors de l'appel de bind"<<endl;
    // ********************************************************
    // Préparation du message à envoyer
    // ********************************************************
    	snprintf(message,1024,
    					"HELO <212.30.xxx.xxx>\r\n"
    					"MAIL FROM:<kedja73@hotmail.fr>"
    					"\r\n"
    					"RCPT TO:<machin.truc@gmail.com>\r\n"
    					"DATA \r\n"
    					"TO:<machin.truc@gmail.com>\r\n"//to
    					"FROM:<SuiviConso>\r\n"//from
    					"SUBJECT:Alerte de dépassement de seuil\r\n"//sujet
    					"\r\n"//separation entete corps
    					"%s\r\n"//corps du message
    					".\r\n"//indiceateur de fin transaction smtp
    					"QUIT\r\n"
    					,corpMess);
    // ********************************************************
    // envoi du message
    // ********************************************************
    	erreur=sendto(sockDesc, message, sizeof(message), 0, (struct sockaddr*)&maSock, sizeof((struct sockaddr*)&maSock));
    	if(erreur<0) cout<<"Echec lors de l'appel de sendto"<<endl;
    	getchar();
    	exit(0);
    }//---------------------------------------------------------------------------
    Ce programme compile mais les fonctions bind et sendto me renvoient -1 et je vois pas pourquoi!
    Si vous avez des idées, elles seront les bienvenues!
    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Le bind ne sert en effet absolument à rien. En plus, si tu dois vraiment attacher ton socket, tu dois utiliser un port compris entre 1024 et 65535, les ports de 0 à 1023 étant reservés (mais l'erreur ne vient pas de là, sauf si t'as un serveur SMTP en activité sur ta machine ou n'importe quel autre logiciel qui utilise déjà le port 25). Utilise GetLastError pour connaître la cause de l'erreur.

    Ensuite dans sendto :
    - Ce n'est pas sizeof(message) qu'il faut mettre mais strlen(message). Regarde dans la FAQ ou dans un cours de C le rôle de l'opérateur sizeof.
    - maSock est invalide. Es-tu sûr que le serveur avec lequel tu veux communiquer se trouve en 194.54.149.19, port 25 ? Moi pas.
    - sizeof((struct sockaddr*)&maSock) retourne la taille d'une adresse (ici celle de maSock) soit 4 sur un processeur 32 bits et 8 sur un processeur 64 bits et non la taille de la structure maSock.

    Un serveur SMTP qui utilise UDP ? Huh ... (j'ai rien dit).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Par défaut
    Salut Melem et merci d'avoir répondu aussi vite!
    Pour blind c'était juste que je me connecter en TCP pour un autre serveur smtp et du coup je l'avais pas enlevé!
    Sinon effectivement pour sizeof c'était une erreur très bête ^^.
    maSock n'est pas invalide par contre, lors de l'appel de socket() il me renvoi pas d'erreur. Pour l'ip je l'ai récupérer après un ping sur smtp.ac-grenoble.fr donc il est bon.
    Enfin après avoir tenu compte de tes remarques, je n'ai plus d'erreur mais je ne reçoit pas le mail pour autant!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    erreur=sendto(sockDesc, message, strlen(message), 0, (struct sockaddr*)&maSock, sizeof(struct sockaddr));
    	if(erreur<0) cout<<"Echec lors de l'appel de sendto"<<endl;
    	int a=GetLastError();
    	cout<<a<<endl;
    GetLastError me retourne 0 donc là je voit pas trop d'où sa peut venir :s
    Merci pour ton aide en tout cas

    P.S : pour le serveur smtp en udp je suis plutôt d'accord avec toi mais c'est l'académie de Grenoble donc je peut rien y faire... En TCP il refuse la connexion...

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Normallement, le protocole SMTP demande à ce que tu recoive/analyse les résultats intermédiaires avant d'envoyer ls commande suivante. Je ne savais même pas qu'il était possible de tout envoyer en une seule fois.

    Ceci dit, puisqu'il semble que cela marche, j'ai peut être une raison pour l'échec :

    Le serveur SMTP que tu utilises est smtp.ac-grenoble.fr
    l'adresse mail de l'emetteur est machin@hotmail.fr
    l'adresse mail du destinataire est truc@gmail.com

    Lorsque tu fais ce test, tu es dans l'université de grenoble ou bien au dehors (à la maison) ?

    Si tu es au dehors, le serveur peut être configuré pour refuser ce message car c'est de relaying de mail (tu utilises un serveur SMTP pour acheminer du mail qui n'est pas à destination de ce serveur de mail). Beaucoup de serveur maintenant refuse ceci car c'est (ou c'était) un des vecteurs principaux du spam.

    Si tu voulais respecter un peut plus le protocole et analyser les échanges, il faudrait que tu envoie ligne par ligne

    send HELO ...
    recv réponse (et affichage)
    send MAIL FROM ...
    recv réponse (et affichage)
    send RCPT TO ...
    recv réponse (et affichage)
    send DATA ...
    recv réponse (et affichage)
    send .
    recv réponse (et affichage)
    send QUIT
    recv réponse (et affichage)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 5
    Par défaut
    Je suis dans l'université et effectivement sa ne marche pas à l'exterieur!
    Je vais faire comme t'a dit pour le protocole au moins je pourrai voir un peu plus précisément d'où vient mon problème!
    Je vous tiens au courant !
    Et merci encore pour votre aide.

Discussions similaires

  1. socket UDP client/serveur
    Par xokami35x dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 10/06/2008, 19h57
  2. [sockets][UDP][C/C++] serveur multi-clients
    Par l@rry dans le forum Développement
    Réponses: 4
    Dernier message: 08/06/2006, 14h11
  3. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 18h03
  4. Réponses: 9
    Dernier message: 17/08/2004, 16h16
  5. Notion sur Socket UDP
    Par oxor3 dans le forum Développement
    Réponses: 3
    Dernier message: 05/04/2004, 00h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo