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

Réseau C Discussion :

Visual C++ express et client UDP


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut Visual C++ express et client UDP
    Bonjour,

    Sur une machine Linux (192.168.0.15), j'ai un serveur UDP de base:

    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
    #!/usr/bin/perl -w
     
    use strict;
    use IO::Socket;
     
    my($sock, $newmsg, $hishost, $MAXLEN, $PORTNO);
     
    $MAXLEN = 1024;
    $PORTNO = 2009;
     
    $sock = IO::Socket::INET->new( LocalPort => $PORTNO, Proto => 'udp') or die "socket: $@";
     
    print "Awaiting UDP messages on port $PORTNO\n";
     
    while ($sock->recv($newmsg, $MAXLEN))
    {
    	my($port, $ipaddr) = sockaddr_in($sock->peername);
    	$hishost = gethostbyaddr($ipaddr, AF_INET);
    	print "Client $hishost said $newmsg\n";
    	$sock->send("CONFIRMED: $newmsg ");
    } 
    die "recv: $!";
    Écrit en Perl, j'ai un client que je fais tourner via Active Perl sur une machine Windows (192.168.0.12) dont voici le code et qui marche:

    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
    #!/usr/bin/perl -w
     
    use IO::Socket;
    use strict;
     
    my($sock, $msg, $port, $ipaddr, $hishost, $MAXLEN, $PORTNO, $TIMEOUT);
     
    $MAXLEN  = 1024;
    $PORTNO  = 2009;
    $TIMEOUT = 5;
     
    $sock = IO::Socket::INET->new(Proto => 'udp', PeerPort => $PORTNO, PeerAddr => '192.168.0.15') or die "Creating socket: $!\n";
     
    $msg = 'testmessage'.time;
     
    $sock->send($msg) or die "send: $!";
     
    eval
    {
    	local $SIG{ALRM} = sub { die "alarm time out" };
    	alarm $TIMEOUT;
    	$sock->recv($msg, $MAXLEN) or die "recv: $!";
    	alarm 0;
    	1;  # return value from eval on normalcy
    } or die "recv from localhost timed out after $TIMEOUT seconds.\n";
     
    print "Server $hishost responded $msg\n";
    Mon problème: J'essaie d'écrire un client en C, dont voici le code:

    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
    #include <winsock2.h>
    #include <windows.h>
    #include <iostream>
     
    #pragma comment(lib, "ws2_32.lib")
     
    using namespace std;
     
    SOCKADDR_IN remote;
    SOCKET sock;
     
    int connexionUDP( char *ip, int port )
    {
    	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    	if (!sock)
    	{
    		cout << "[udp.cpp][connexionUDP] Connexion UDP impossible" << endl;
    		return(0);
    	}
    	remote.sin_family = AF_INET;
    	remote.sin_addr.s_addr = inet_addr(ip);
    	remote.sin_port = htons(port);
    }
     
    void setMessageUDP( char *message )
    {
    	char msg[255];
    	sprintf ( msg, "%s\n", message );
    	memset(msg, '\0', sizeof(msg));
    	sendto(sock, msg, strlen(msg), 0, (SOCKADDR *)&remote, sizeof(SOCKADDR));
    }
     
    void fermeConnexionUDP()
    {
    	closesocket(sock);
    }
    Je l'exécute dans mon main par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    connexionUDP( "192.168.0.15", 2009 );
    setMessageUDP( "Message Visual C++" );
    fermeConnexionUDP();
    Problème, je n'ai aucune erreur mais mon serveur ne reçoit rien, alors qu'avec le script Perl sur la même machine ça marche.
    Avez-vous une idée ?

    Cordialement.

  2. #2
    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
    Normal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void setMessageUDP( char *message )
    {
    	char msg[255];
    	sprintf ( msg, "%s\n", message );
    	memset(msg, '\0', sizeof(msg));
    	sendto(sock, msg, strlen(msg), 0, (SOCKADDR *)&remote, sizeof(SOCKADDR));
    }
    tu créés le message avec sprintf ok
    tu reset le buffer avec memset bof
    tu envoie le buffer avec sa longueur la longeur suite au reset vaut 0


    Un petit mélange dans l'ordre des lignes ?
    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
    .

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Lovmy Voir le message
    Problème, je n'ai aucune erreur mais mon serveur ne reçoit rien, alors qu'avec le script Perl sur la même machine ça marche.
    Avez-vous une idée ?
    En C, ceci devrait fonctionner (merci d'éviter les globales...)
    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
     
    #include <winsock2.h>
    #include <stdio.h>
     
    struct cnx
    {
       SOCKADDR_IN remote;
       SOCKET sock;
    };
     
    int connexionUDP (struct cnx *p, char *ip, int port)
    {
       int ok;
       p->sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
       if (p->sock != INVALID_SOCKET)
       {
          p->remote.sin_family = AF_INET;
          p->remote.sin_addr.s_addr = inet_addr (ip);
          p->remote.sin_port = htons (port);
          ok = 1;
       }
       else
       {
          printf ("[udp.cpp][connexionUDP] Connexion UDP impossible\n");
          ok = 0;
       }
       return ok;
    }
     
    void setMessageUDP (struct cnx *p, char *message)
    {
       char msg[255];
       sprintf (msg, "%s\n", message);
     
       sendto (p->sock, msg, strlen (msg), 0, (SOCKADDR *) & p->remote,
               sizeof (SOCKADDR));
    }
     
    void fermeConnexionUDP (struct cnx *p)
    {
       closesocket (p->sock);
    }
     
    int main (void)
    {
       WSADATA wsa_data;
       int err = WSAStartup (MAKEWORD (2, 2), &wsa_data);
       if (!err)
       {
          struct cnx cnx = { 0 };
     
          int ok = connexionUDP (&cnx, "192.168.0.1", 23);
     
          if (ok)
          {
             setMessageUDP (&cnx, "Hello world\n");
             fermeConnexionUDP (&cnx);
          }
          else
          {
             printf ("error\n");
          }
          WSACleanup ();
       }
       return 0;
    }

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut Meme probleme
    Re,

    J'ai changé ma fonction en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void setMessageUDP( char *message )
    {
    	char msg[255];
    	sprintf ( msg, "%s\n", message );
    	printf ( "%s", msg );
    	sendto(sock, msg, strlen(msg), 0, (SOCKADDR *)&remote, sizeof(SOCKADDR));
    }
    Mais le probleme reste le meme, le message n'est pas vide, le printf me le confirme.

    Cordialement.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Lovmy Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void setMessageUDP( char *message )
    {
    	char msg[255];
    	sprintf ( msg, "%s\n", message );
    	printf ( "%s", msg );
    	sendto(sock, msg, strlen(msg), 0, (SOCKADDR *)&remote, sizeof(SOCKADDR));
    }
    Mais le probleme reste le meme, le message n'est pas vide, le printf me le confirme.
    Pourquoi le message serait-il vide ? Tu écris dans msg. Il n'est donc pas vide...

    Je ne comprends pas ce que tu cherches à faire...

    Il y a risque de débordement si le message est trop long.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Et aussi, le paramètre message devrait être un pointeur const.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut Oui mais
    Bonjour,

    Oui j'ai bien le message à envoyer, donc il devrait l'envoyer mais... Il ne l'envoi pas. Pour résumer, sur mon poste Window en 192.168.0.12 je lance mon script perl client UDP (voir 1er post), mon firewall détecte une tentative de connexion UDP, et mon serveur Linux sur lequel tourne mon serveur UDP recoit la demande.
    Je lance mon programme en C, mon firewall ne détecte aucune tentative de connexion, et bien sur mon serveur ne recoit rien. Pourtant je n'ai pas d'erreur coté client C, donc je me demande si je n'ai rien oublié dans mon code C.
    Evidenment mon firewall ne bloque par l'acces au réseau de mon application C, d'ailleurs j'ai essayé en le désactivant et le résultat reste le meme.

    Merci pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. erreur Client UDP
    Par innosang dans le forum Réseau
    Réponses: 6
    Dernier message: 04/01/2006, 09h33
  2. [Socket] Client UDP
    Par AxldenieD dans le forum Réseau
    Réponses: 12
    Dernier message: 22/11/2005, 12h59
  3. [C#][Visual C# Express] Gros souci avec Excel
    Par poullos dans le forum EDI/Outils
    Réponses: 7
    Dernier message: 18/11/2005, 13h15
  4. [C#] visual studio express / add-in outlook
    Par xxbillouxx dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/11/2005, 14h35
  5. [visual C++ express] Probleme de config
    Par lejert dans le forum MFC
    Réponses: 7
    Dernier message: 30/07/2005, 09h52

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