我正在寫兩個腳本:客戶端和服務器。客戶端將自身連接到服務器並輸入憑據。我想通過散列發送這些憑證,所以我將它們序列化,將它們發送到服務器套接字,然後在服務器腳本中反序列化散列。如何序列化和反序列化發送到套接字的哈希?
下面是相關服務器腳本代碼:
$server = IO::Socket::INET->new(Proto => tcp,
LocalPort => 25,
Listen => SOMAXCONN,
Reuse => 1) or die "cannot connect to port $port at localhost";
while (my $new_socket = $serveur->accept())
{
$new_socket->autoflush(1);
$line = <$new_socket>;
my %hashUserInfos = %{thaw($line)};
my $username = $hashInfosUtilisateur{'username'};
my $password = $hashInfosUtilisateur{'password'};
}
這裏是相關的客戶端腳本代碼:
my $connection = IO::Socket::INET->new(Proto => $protocol,
PeerAddr => $destination,
PeerPort => $port) or die "Impossible de se connecter sur le port $port a l'adresse $destination";
print "Nom d'usager:\n";
$username = <STDIN>;
print "Mot de passe:\n";
my $password = <STDIN>;
my $hashedPasword = md5_hex($password);
my %userInfos = ('username' => $username, 'password' => $hashedPassword);
my $serializedInfos = freeze \%userInfos;
print $connection $serializedInfos;
我現在面臨的問題是,當我試圖反序列化哈希:
my %hashUserInfos = %{thaw($line)};
,我發現了錯誤:
Magic number checking on storable string failed
我也試過我的序列化與哈希nfreeze
,但在這種情況下,我得到的不是以上這一個錯誤:
Can't use an undefined values as a HASH reference
什麼是我做這裏的錯誤?
您是否嘗試過在服務器和客戶端中打印序列化哈希並比較輸出? – choroba
@choroba我沒有比較它們,但在調試時。他們的價值觀是不可理解的,所以我認爲這是正常的,因爲他們被序列化。以下圖片顯示了客戶端和服務器中序列化哈希的輸出。然而,它是另一個散列,而不是問題中的一個(用戶名和密碼)。但是哈希以同樣的方式被序列化/反序列化。這是[客戶端序列化哈希圖片](http://i.imgur.com/g5IWcH1.png)和[服務器序列化哈希](http://i.imgur.com/PFTg9zE.png)。 – TheWanderingMind
您只能讀取'$ new_socket'中的一行,但序列化的散列似乎有幾行。 – choroba