2013-04-23 41 views
2

有一件事我很想知道什么时候在Perl中进行套接字编程。我正尝试通过我的套接字发送两个变体。它的工作原理,我可以发送,但我希望一个接一个。让我告诉你我的代码和输出我得到:Perl - 通过套接字发送多个数据

服务器

my $var1 = 200; 
chomp($var1); 
$socket->send($var1); 

my $var2 = 300; 
chomp($var2); 
$socket->send($var2); 

CLIENT

$socket->recv(my $var1, 4000); 
chomp($var1); 
$socket->recv(my $var2, 4000); 
chomp($var2); 

print "From server: My height is: $var1 cm, weight is: $var2 kg\n"; 

好了,我的预期输出应该是:从服务器:我身高:400厘米,重量是:300厘米。相反,我的输出如下所示:From server:My height is:400300 cm,weight is:

嗯,我看不出为什么我的代码是错误的。我应该能够像这样一个一个地接收数据吗?我如何最终解决这个问题以正确接收数据?

+2

在你的变量之间插入一些分隔符,并在接收端分割它 – perreal 2013-04-23 21:17:53

回答

2

简短回答:使用数据报套接字或实现划分不同消息的通信协议。

你问:

不应该我能够通过一个这样的接收数据吗?

你可以做到这一点很容易在数据报套接字如UDP:IO::Socket::INET->new(Type => SOCK_DGRAM, ...)。那里的作家/读者协议是发送和接收离散的数据包,并发送/ recv将做你想做的。

另一方面,TCP这样的套接字具有连续的字节流模型。在这里您需要某种记录分隔符或消息大小或类似的初始传输。我怀疑这是你正在使用的。

流套接字与普通文件不同,它显示为“bytestream”IO句柄。如果一个文件包含字符串“300400”,而没有任何换行,该文件的读者如何知道该字符串实际上是两条记录而不是一条(或六条或五条或不完整的记录等)?