5

この方法で作成されたperlのノンブロッキングUDPソケットがあります

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

recv呼び出しは

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

a)読み取るデータが残っていない場合b)データがある場合、読み取られたデータの量c)エラー状態を知る必要があります

驚いたことに、perldocにrecvの戻り値が表示されませんでした。自分で試してみると、recvは(a)でundefを返します。bの場合は印刷できない文字です。

これは初歩的な問題のようです。しかし、私はまだグーグルやスタックオーバーフローに関する情報を見つけることができません。入力をありがとう

4

2 に答える 2

4

perldocによると、recvは「SOCKETのプロトコルがこれをサポートしている場合は送信者のアドレスを返します。それ以外の場合は空の文字列を返します。エラーがある場合は未定義の値を返します。」

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

コードのエラーは次の行にあります。

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

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

recv SOCKET,SCALAR,LENGTH,FLAGS 

perldocによると、recvは「指定されたSOCKETファイルハンドルから変数SCALARにデータのLENGTH文字を受信しようとします。SCALARは実際に読み取られた長さまで拡大または縮小されます。」

試す:

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

ここで私はすべての情報を入手しました:http: //perldoc.perl.org/functions/recv.html

于 2012-05-14T08:04:34.057 に答える
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);
于 2014-05-04T17:56:11.163 に答える