【发布时间】:2016-03-02 17:05:56
【问题描述】:
我正在编写两个脚本:客户端和服务器。客户端将自己连接到服务器并且必须输入凭据。我想通过散列发送这些凭据,所以我将它们序列化,将它们发送到服务器套接字,然后在服务器脚本中反序列化散列。
这里是相关的服务器脚本代码:
$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)};
我收到了错误:
对可存储字符串的幻数检查失败
我还尝试使用nfreeze 序列化我的哈希,但在这种情况下,我得到的是这个错误而不是上面的错误:
不能使用未定义的值作为 HASH 引用
我在这里犯了什么错误?
【问题讨论】:
-
您是否尝试过在服务器和客户端打印序列化哈希并比较输出?
-
@choroba 我确实比较了它们,但在调试时。他们的价值观有点难以理解,所以我认为这是正常的,因为他们被连载了。下图显示了客户端和服务器中序列化哈希的输出。但是,它是问题中的哈希值(用户名和密码)之外的另一个哈希值。但是哈希以相同的方式序列化/反序列化。这是picture of the client serialized hash 和server serialized hash。
-
你只从
$new_socket中读取了一行,但是序列化的哈希似乎有好几行。 -
@choroba 啊...有没有办法只通过一行发送序列化的哈希?
标签: perl sockets serialization hash deserialization