如何接收分别从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++;
}
答案 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
和相关函数,以将更大的整数值编码为几个字节的内存。