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

Langage Perl Discussion :

Portée des variables


Sujet :

Langage Perl

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
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 278
    Par défaut Portée des variables
    Bonjour,

    J'essaye d'écrire un serveur/client UDP, et j'ai un petit problème, voici le source du serveur:

    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
    #!/usr/bin/perl -w
     
    use strict;
    use IO::Socket;
     
    my($sock);
    my($newmsg);
    my($port);
    my($ipaddr);
    my($arret);
    my($boucle);
    my($x);
    my($y);
    my($dir);
    my($MAXLEN);
    my($PORTNO);
     
    $arret = 0;
    $boucle = 0;
    $x = 0;
    $y = 0;
    $dir = 0;
    $MAXLEN = 20;
    $PORTNO = 1027;
     
    $sock = IO::Socket::INET->new( LocalPort => $PORTNO, Proto => 'udp') or die "socket: $@";
     
    print "Serveur demarre sur port $PORTNO\n";
     
    while ( $arret == 0 )
    {
    	if ( $sock->recv( $newmsg, $MAXLEN ,MSG_DONTWAIT ) )
    	{
    		($port,$ipaddr) = sockaddr_in($sock->peername);
    		print "Recu $newmsg\n";
    		if ( $newmsg =~ "^GO+" )
    		{
    			$boucle = 1;
    		}
    	}
    	if ( $boucle == 1 )
    	{
    		if ( $dir == 0 )
    		{
    			if ( $x == 100 )
    			{
    				$y++;
    				if ( $y == 100 )
    				{
    					$dir = 1;
    				}
    			}
    			else
    			{
    				$x++;
    			}
    		}
    		else
    		{
    			if ( $x == 0 )
    			{
    				$y--;
    				if ( $y == 0 )
    				{
    					$dir = 0;
    				}
    			}
    			else
    			{
    				$x--;
    			}
    		}
    		$sock->send( $ipaddr.";".$x.";".$y."\0\n" );
    		sleep ( 1 );
    	}
    } 
    die "recv: $!";
    et le source du client:

    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
    #!/usr/bin/perl -w
     
    use IO::Socket;
    use strict;
     
    my($sock, $msg, $port, $ipaddr, $hishost, $MAXLEN, $PORTNO, $TIMEOUT);
     
    $MAXLEN  = 1024;
    $PORTNO  = 1027;
    $TIMEOUT = 5;
     
    $sock = IO::Socket::INET->new(Proto => 'udp', PeerPort => $PORTNO, PeerAddr => 'localhost') or die "Creating socket: $!\n";
     
    $sock->send("GO") or die "send: $!";
     
    while ($sock->recv($msg, $MAXLEN))
    {
    	print "$msg\n";
    } 
    die "recv: $!";
    Petit problème, à l'exécution j'ai l'erreur suivante coté serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Serveur demarre sur port 1027
    Recu GO
    send: Cannot determine peer address at ./serveur.pl line 73
    J'ai l'impression que la variable $sock n'est pas initialisée à la ligne 73 (dans le send) alors qu'elle l'est ligne 32 (dans le recv). Je pense donc à un problème de portée de variable mais je ne sais pas comment rendre $sock globale, d'autant que "use strict;" m'oblige à les déclarer en my(...).

    Merci d'avance pour votre aide.

    Cordialement.

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    $sock me semble avoir la bonne portée.

    Edit : commentaire supprimé, je pense que c'était une bêtise.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    As-tu essayé 127.0.0.1 à la place de localhost comme PeerAddr dans le client ?

    Edit :
    Mmmh... ça me semble à nouveau une bêtise...
    désolé

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Ajoute $ipaddr et $port dans ce print :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Recu $newmsg\n";

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 278
    Par défaut 2eme passage
    Re,

    Les variables $ipaddr, $port, $sock sont tous égal à quelque chose.
    Par contre le send se fait bien la première fois, c'est lors du deuxième passage que j'ai l'erreur.
    Lors de ce deuxième passage, je ne rentre pas dans la boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $sc->recv( $newmsg, $MAXLEN ,MSG_DONTWAIT ) )
    { ...
    }
    Cela influence-t-il $sock ?

    Merci de vos réponses, cordialement.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Oui, en fait, ça me semble normal, puisque tu utilises l'option DONTWAIT, donc même s'il n'y a aucun message à lire, on ne rentre pas dans le if, et comme on a position $boucle à un précédemment, on rentre dans la boucle.
    Essaye en plaçant le if ( $boucle == 1 ) dans la bloc du if ( $sock->recv( $newmsg, $MAXLEN ,MSG_DONTWAIT ) )

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 278
    Par défaut Pas compris la...
    Re,

    J'ai mis le MSG_DONTWAIT pour éviter de bloquer sur le recv. En fait mon programme reçoit "GO", à partir de ce moment il doit envoyer le message toutes les secondes jusqu'à ce qu'il reçoive "STOP" en ajoutant dans le if du recv:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( $newmsg =~ "^STOP+" )
    {
    	$boucle = 0;
    }
    Pourquoi et ou mettre un

    dans le if du recv ?

    Je ne sais pas ce qu'il "perd" dans $sock entre la première et la seconde itération quand il arrive au send.

    Cordialement.

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 278
    Par défaut recv pose probleme
    Re,

    En fait c'est le recv qui pose problème quand il n'y a rien a recevoir. J'ai modifié mon code comme suis, et la ça marche, mais cela ne m'arrange pas car je ne peut plus envoyer de message au serveur:

    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
    #!/usr/bin/perl -w
     
    use strict;
    use IO::Socket;
     
    my($sc, $newmsg, $port, $ipaddr, $arret, $boucle, $x, $y, $dir, $MAXLEN, $PORTNO, $nbBoucle);
     
    $arret = 0;
    $boucle = 0;
    $x = 0;
    $y = 0;
    $dir = 0;
    $MAXLEN = 20;
    $PORTNO = 1027;
     
    $sc = IO::Socket::INET->new( LocalPort => $PORTNO, Proto => 'udp') or die "socket: $@";
     
    print "[serveur.pl] Serveur demarre sur port $PORTNO\n";
     
    while ( $arret == 0 )
    {
    	if ( $boucle == 0 )
    	{
    		if ( $sc->recv( $newmsg, $MAXLEN, MSG_DONTWAIT ) )
    		{
    			($port,$ipaddr) = sockaddr_in($sc->peername);
    			print "[serveur.pl] ($port) ($ipaddr) Recu $newmsg\n";
    			if ( $newmsg =~ "^GO+" )
    			{
    				print "[serveur.pl] Demarrage boucle\n";
    				$boucle = 1;
    			}
    			if ( $newmsg =~ "^STOP+" )
    			{
    				print "[serveur.pl] Arret boucle\n";
    				$boucle = 0;
    				$nbBoucle = 5;
    			}
    		}
    	}
    	if ( $boucle == 1 )
    	{
    		if ( $dir == 0 )
    		{
    			if ( $x == 100 )
    			{
    				$y++;
    				if ( $y == 100 )
    				{
    					$dir = 1;
    				}
    			}
    			else
    			{
    				$x++;
    			}
    		}
    		else
    		{
    			if ( $x == 0 )
    			{
    				$y--;
    				if ( $y == 0 )
    				{
    					$dir = 0;
    				}
    			}
    			else
    			{
    				$x--;
    			}
    		}
    		$sc->send( $ipaddr.";".$x.";".$y."\0\n", 0, $sc->peername );
    		sleep ( 1 );
    	}
    } 
    die "recv: $!";
    Donc dans ce cas on ne fait qu'un recv, il récupère le "GO", met $boucle à 1 et les send s'enchaine toutes les secondes. Mais je ne fais plus de recv par la suite.

    Que peut bien modifier dans $sock le recv si il ne recoit pas de données pour que send ne fonctionne plus ?

    Cordialement.

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/02/2005, 10h05
  2. [FLASH MX] Portée des variables ???
    Par mic79 dans le forum Flash
    Réponses: 2
    Dernier message: 08/02/2005, 11h21
  3. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 11h14
  4. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 11h34
  5. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 22h05

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