2015-11-28 43 views
2

我正在寫兩個腳本:客戶端和服務器。客戶端將自身連接到服務器並輸入憑據。我想通過散列發送這些憑證,所以我將它們序列化,將它們發送到服務器套接字,然後在服務器腳本中反序列化散列。如何序列化和反序列化發送到套接字的哈希?

下面是相關服務器腳本代碼:

$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

什麼是我做這裏的錯誤?

+0

您是否嘗試過在服務器和客戶端中打印序列化哈希並比較輸出? – choroba

+0

@choroba我沒有比較它們,但在調試時。他們的價值觀是不可理解的,所以我認爲這是正常的,因爲他們被序列化。以下圖片顯示了客戶端和服務器中序列化哈希的輸出。然而,它是另一個散列,而不是問題中的一個(用戶名和密碼)。但是哈希以同樣的方式被序列化/反序列化。這是[客戶端序列化哈希圖片](http://i.imgur.com/g5IWcH1.png)和[服務器序列化哈希](http://i.imgur.com/PFTg9zE.png)。 – TheWanderingMind

+1

您只能讀取'$ new_socket'中的一行,但序列化的散列似乎有幾行。 – choroba

回答

1

@choroba在評論中說,你只能在服務器上讀取一行,儘管你可以通過在服務器中讀取更多的行來修復它,但你可能想要換行符作爲記錄分隔符。

你可以凍結只能通過刪除你的用戶名和密碼讀取換行符用一條線:chomp($username);chomp($password);

您也可以編碼換行符,雖然這是一個有點hackish,而不是愚弄證明。編碼:$serializedInfos =~ s/\n/\\n/g;解碼:$line =~ s/\\n/\n/g;

或者你可以說你正在使用改變,而不是Storage到只用一條線,像JSON序列化。