2013-04-23 42 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」,而沒有任何換行,該文件的讀者如何知道該字符串實際上是兩條記錄而不是一條(或六條或五條或不完整的記錄等)?