首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在perl中使用recv()接收可变数量的数据

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

Stack Overflow用户
提问于 2013-10-11 04:14:49
回答 1查看 543关注 0票数 1

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

代码语言:javascript
复制
$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++;
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-11 05:06:01

正如您所说的,问题在于接收套接字不知道要读取多少数据。解决方案是一种约定,它使用额外的数据来告诉接收套接字有多少数据要读取,这有点像Content-length消息中的HTTP头。

您通常发送较小的数据包(值在"0“和”255“之间?),那么在每条消息前面加上消息的字节长度如何?

代码语言:javascript
复制
$proxyN->send(length($ascii) . "$ascii");

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

代码语言:javascript
复制
$receiver->recv($count, 1);
$receiver->recv($value, $count);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19305342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档