【问题标题】:variable amount of data receive using recv() in perl在 perl 中使用 recv() 接收可变数量的数据
【发布时间】:2013-10-10 20:14:48
【问题描述】:

如何在server1、server2、server3上接收分别从proxy1、proxy2、proxy3发送的数据,因为它不是固定的数据量,它可能会改变?

$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++;
}

【问题讨论】:

  • 你有什么问题?
  • 我遇到的问题是,当我编写 server1 的代码以使用 recv() 命令从 proxy2 接收值时,server1 不知道从 proxy2 发送了多少值,因为变量的值发送的 ascii 可能会改变,因为我正在接受输入。基本上我是 perl 编程的新手。任何小的帮助将不胜感激

标签: perl recv


【解决方案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 和相关函数,以将较大的整数值编码到几个字节的内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2013-04-03
    • 2014-01-14
    • 2015-12-27
    • 2016-07-23
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多