Bonjour,
J'essaye d'écrire un serveur/client UDP, et j'ai un petit problème, voici le source du serveur:
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
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: $!";
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
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: $!";
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(...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3Serveur demarre sur port 1027 Recu GO send: Cannot determine peer address at ./serveur.pl line 73
Merci d'avance pour votre aide.
Cordialement.
Partager