2012-05-14 3 views
4

J'ai prise UDP non de blocage en perl créé cette façonvaleur de retour de recv() en Perl

my $my_sock = IO::Socket::INET->new(LocalPort => $MY_PORT, 
            Proto => 'udp', 
        Blocking => '0') or die "socket: [email protected]"; 

L'appel recv est

my $retValue = $sock->recv($my_message, 64); 

Je dois savoir a) quand il b) s'il y a des données, combien de données a été lu toute valeur de retour pour recv dans perldoc. Quand je l'ai essayé moi-même, recv retourne undef dans (a), car b est un caractère non imprimable

Cela semble être un problème élémentaire. Cependant, je ne trouve toujours pas les informations sur googling ou sur débordement de pile.Merci pour toutes les entrées

+1

Si 'recv' renvoie undef, vérifiez $!' Pour le code d'erreur. – ikegami

+0

Il existe de bons exemples ici: http://perldoc.perl.org/perlipc.html#Sockets%3a-Client%2fServer-Communication –

Répondre

3

Selon le perldoc, recv "retourne l'adresse de l'expéditeur si le protocole de SOCKET supporte cela, renvoie une chaîne vide sinon. une erreur, renvoie la valeur indéfinie. "

Si vous obtenez un undef, cela signifie que recv rencontre une erreur.

L'erreur dans votre code est dans la ligne suivante:

$retValue = $sock->recv($my_message, 64); 

Le prototype de fonction pour recv est:

recv SOCKET,SCALAR,LENGTH,FLAGS 

Selon perldoc, recv « Les tentatives de recevoir des caractères de longueur des données en variable SCALAR à partir du handle de fichier SOCKET spécifié SCALAR sera développé ou réduit à la longueur réellement lue. "

Essayez:

$retvalue = recv($sock, $my_message, 64) 

C'est là que je suis toutes les informations: http://perldoc.perl.org/functions/recv.html

+0

Merci. J'ai lu perldoc mais comme je suis novice, je n'ai pas bien compris les arguments. Bien qu'il ne soit pas clair pourquoi perl ne me permettrait pas de déterminer la raison de l'erreur. – doon

+2

Vous avez regardé dans les documents écrits. Les documents pour le IO :: Socket :: INET sont trouvés [ici] (http://search.cpan.org/perldoc?IO::Socket::INET) et sa classe parente est [ici] (http: // search.cpan.org/perldoc?IO::Socket). '$ sock-> recv ($ my_message, 64)' est en fait l'utilisation correcte, bien que 'recv ($ sock, $ my_message, 64)' devrait fonctionner aussi bien. – ikegami

2

La valeur retournée par recv est l'adresse et le port que ces données ont été reçues de

my $hispaddr = $sock->recv($my_message, 64); 

if ($retValue) { 
    my ($port, $iaddr); 
    ($port, $iaddr) = sockaddr_in($hispaddr); 
    printf("address %s\n", inet_ntoa($iaddr)); 
    printf("port %s\n", $port); 
    printf("name %s\n", gethostbyaddr($iaddr, AF_INET)); 
} 

La longueur des données renvoyées peut être déterminée avec

length($my_message);