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

在perl中使用recv()接收的数据量可变,perl,recv,Perl,Recv,如何在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',PeerAd

如何在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++;
}
$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;
而($b48&$asciisend($ascii”);
}
elsif($ascii>64&&$ascii96&&$asciisend($ascii”);
}
否则{
打印(“ASCII=”.$ASCII);
打印(“它是一个字符。\n”);
$proxy4->send($ascii”);
}
$b++;
}

正如您所说,问题在于接收套接字不知道有多少数据要读取。解决方案是使用附加数据通知接收套接字有多少数据要读取,有点像HTTP消息中的
内容长度
标头

您通常发送的是小数据包(值介于“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)
)在接收器上。如果消息可能更长,您需要查看
和相关函数,将更大的整数值编码到几个字节的内存中。

正如您所述,问题是接收套接字不知道有多少数据要读取。解决方案是一种使用附加数据的约定l接收套接字有多少数据要读取,有点像HTTP消息中的
内容长度

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

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