1

如何在 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++;
}
4

1 回答 1

1

正如您所说,问题在于接收套接字不知道要读取多少数据。解决方案是使用附加数据告诉接收套接字有多少数据要读取的约定,有点像Content-lengthHTTP 消息中的标头。

您通常发送小数据包(“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相关函数以将较大的整数值编码到几个字节的内存中。

于 2013-10-10T21:06:01.157 回答