1

一定量のデータではないため、proxy1、proxy2、proxy3 からそれぞれ送信される server1、server2、server3 でデータを受信する方法は?

$proxy2=IO::Socket::INET->new(PeerPort=>'5431',Proto=>'UDP',PeerAddr=>'127.0.0.1');
$proxy3=IO::Socket::INET->new(PeerPort=>'5430',Proto=>'UDP',PeerAddr=>'127.0.0.1');
$proxy4=IO::Socket::INET->new(PeerPort=>'5429',Proto=>'UDP',PeerAddr=>'127.0.0.1');

$b=0;
while($b<10){
  $ascii=ord($msg1[$b]);

  if($ascii>48 && $ascii<59){
    print ("ASCII=".$ascii);
    print ("It is an number.\n");
    $proxy2->send("$ascii");
  }
  elsif($ascii>64 && $ascii<91  ||  $ascii>96 && $ascii<123){
    print ("ASCII=".$ascii);
    print ("It is an alphabet.\n");
    $proxy3->send("$ascii");
  }
  else{
    print ("ASCII=".$ascii);
    print ("It is a character.\n");
    $proxy4->send("$ascii");
  }
  $b++;
}
4

1 に答える 1

1

あなたが述べているように、問題は、受信ソケットが読み取るデータの量を認識していないことです。解決策は、追加のデータを使用して、受信ソケットに読み取る必要のあるデータの量を伝える規則ですContent-length。これは、HTTP メッセージのヘッダーのようなものです。

通常、小さなパケット (「0」から「255」の間の値?) を送信する場合、各メッセージの前にメッセージの長さをバイト単位で指定するのはどうでしょうか?

$proxyN->send(length($ascii) . "$ascii");

受信側では、2 つのrecv呼び出しを行います。1 バイトの最初のもの。最初の呼び出しで指定されたバイト数の 2 つ目。

$receiver->recv($count, 1);
$receiver->recv($value, $count);

このスキームは、最大 9 バイトの長さのペイロードに対して機能します。ペイロードが最大 255 バイトの場合、送信側で長さを 8 ビット整数としてエンコードし (たとえば を使用chr(length($message)))、受信側でデコードします (たとえば$len=ord($count))。メッセージがさらに長くなる可能性がある場合はpack、関連する関数を調べて、より大きな整数値を数バイトのメモリにエンコードする必要があります。

于 2013-10-10T21:06:01.157 に答える