在perl中使用recv()接收可变数量的数据

时间:2013-10-10 20:14:49

标签: perl recv

如何接收分别从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++;
}

1 个答案:

答案 0 :(得分:1)

正如您所说,问题是接收套接字不知道要读取多少数据。该解决方案是一种约定,它使用附加数据告诉接收套接字要读取多少数据,类似于HTTP消息中的Content-length标头。

您通常是在发送小数据包(“0”和“255”之间的值?),那么您在每条消息之前的信息长度如何以字节为单位?

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

在接收端,您将进行两次recv来电。单个字节的第一个。第二个是第一次调用中指定的字节数。

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

此方案适用于长度最多为9个字节的有效负载。如果您的有效负载最多可达255个字节,您可以将长度编码为发送器上的8位整数(例如,使用chr(length($message)))并在接收器上对其进行解码(例如,$len=ord($count))。如果消息可能更长,您将需要查看pack和相关函数,以将更大的整数值编码为几个字节的内存。