2016-08-03 33 views
1

私は、client and serverサンプルをPerlでTCP protocolを使って書いています。 だから私はsend()recv()関数を使用しました。 私はrecv()の戻り値を取得しようとしました。 サンプルコードでは、私は私のコードを実行すると、それは任意の値を印刷しない、perlでTCPプロトコルを使用してrecv()とsend()の戻り値をチェックする方法は?

my $return_value; 
$return_value = recv($client_socket, $data, 50, 0); 
print "return value is: $return_value\n"; 

です。たとえば :

return value is: 

はその後、私は任意の戻り値を取得していないにも関わらず、下記のリンクをお読みください。 return value of recv() function in perl

どうすればこの問題を解決できますか?

ありがとうございました。

+0

http://perldoc.perl.org/functions/recv.htmlのrecv - scketのプロトコルは、 'RECV(この –

+0

戻り値をサポートしている場合、'、あなたがする必要があるバイナリ値である)、送信者のアドレスを返します'Socket :: unpack_sockaddr_in()'に渡してIPアドレスとポートを取得します。私はそれが通常、不器用なように印刷するだろうと思うが、それはあなたのケースに印刷可能な文字を含んでいない可能性があります。出力を 'xxd'にパイプして見ることができます。つまり、 'recv()'は実際にはTCPサーバにとって選択肢の機能ではありません。行ベースの通信には 'print()'と '<>'を使うことができます。また、より美しいもののために 'read()'/'write()'を使うこともできます。 – mbethke

答えて

3

エラーが発生したことを示す、おそらくundefです。[1]

use Socket qw(unpack_sockaddr_in); 

defined($return_value) 
    or die("Can't recv: $!\n"); 

my ($peer_port, $peer_addr) = unpack_sockaddr_in($return_value); 

あなたはすでに通信している相手のアドレスとポートを知っているので、あまり役に立ちません。これにより、なぜrecvsysreadの代わりに)とTCPのような接続されたストリーミングプロトコルを使用しているのかという疑問が浮上しますか?あなたが時々あなたが要求した50文字未満になることは分かりますか?


  1. 常にuse strict; use warnings 'all';を使用! $return_valueがundefの場合、"return value is: $return_value\n"は警告しています。
+0

はい、私は 'use strict'と' use warnings'を使いました。しかし、それは私に警告しなかった、それはまた、任意の価値を印刷していない –

関連する問題