如何在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++;
}发布于 2013-10-11 05:06:01
正如您所说的,问题在于接收套接字不知道要读取多少数据。解决方案是一种约定,它使用额外的数据来告诉接收套接字有多少数据要读取,这有点像Content-length消息中的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和相关函数,以便将更大的整数值编码到几个字节的内存中。
https://stackoverflow.com/questions/19305342
复制相似问题