2012-05-14 26 views
4

内の関数は、私はPerlで非ブロッキングUDPソケットは、この方法で作成した戻り値()perlの

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

のrecvコールは、私が知っている必要があり

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

ある a)のときが残っているデータがない b)データがある場合、読み取ったデータの量 c)任意のエラー条件

驚いたことに、私は見たことがありませんperldocのrecvの戻り値私はそれを自分で試してみましたが、recvは(a)のundefを返します.bは印刷できない文字です

これは基本的な問題です。しかし、私はまだグーグルやスタックオーバーフローに関する情報を見つけることができません。どんな入力でも大丈夫です。

+1

'recv'がundefを返す場合は、エラーコードとして' $! 'をチェックしてください。 – ikegami

+0

良い例がここにあります:http://perldoc.perl.org/perlipc.html#Sockets%3a-Client%2fServer-Communication –

答えて

3

perldocによると、recvはSOCKETのプロトコルがこれをサポートしていれば送信者のアドレスを返し、そうでなければ空文字列を返します。エラーは、未定義の値を返します。

undefを取得している場合、これはrecvにエラーが発生していることを意味します。

あなたのコード内のエラーが次の行にされています

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

のrecv関数のプロトタイプは次のとおりです。はperldocによると

recv SOCKET,SCALAR,LENGTH,FLAGS 

、RECVは「へのデータの長さの文字を受信しようと指定されたSOCKETファイルハンドルからの変数SCALAR。SCALARは実際に読み取られた長さに伸縮します。

試してみてください。私はすべての情報を得たところ

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

これは、次のとおりです。 http://perldoc.perl.org/functions/recv.html

+0

ありがとうございました。私はperldocを読んだことがありますが、初心者なので私は引数を正しく理解しませんでした。 Perlが私にエラーの理由を判断させない理由は明確ではありませんが。 – doon

+2

あなたは書類を見ました。 IO :: Socket :: INETのドキュメントは、[here](http://search.cpan.org/perldoc?IO::Socket::INET)にあり、その親クラスは[ここ](http:// search.cpan.org/perldoc?IO::Socket)。 '$ sock-> recv($ my_message、64)'は実際には正しい使い方ですが、 'recv($ sock、$ my_message、64)'も同様に動作します。 – ikegami

2

recvによって返される値は、データが

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)); 
} 
から受信したことをアドレスとポートです

返されるデータの長さは、

length($my_message);