Perl套接字发送哈希

时间:2012-12-04 07:15:49

标签: perl sockets

我正在尝试在Perl中创建一个套接字客户端。服务器端是在本地主机上运行的C程序。

我必须在套接字上发送一个哈希值。这是我正在使用的一段代码。

sub applyGlobalConfig {
    my ($globalConfig, $ignoreData) = @_;

    my $socket = IO::Socket::INET->new(PeerAddr => $PEER_HOST,
                                       PeerPort => $PEER_PORT,
                                       Proto    => "tcp",
                                       Type     => SOCK_STREAM)
          or die "Couldn't connect to $PEER_HOST:$PEER_PORT : $@\n";

    my $reconfigResult;

    print $socket "$113\n";

    close($socket);

    unless ($reconfigResult) {
        return 0;
    }

    return ERR_NULL;
}

现在,问题是,$globalConfig将包含一个哈希引用,我想通过套接字发送它。我无法弄清楚。我用Google搜索并发现了一些对Dumper的引用,但不太了解。如何发送哈希值?

2 个答案:

答案 0 :(得分:6)

要通过套接字发送数据结构,您必须"序列化"它变成了一个字节流。然后接收程序必须对其进行反序列化以重新组装数据结构。如果接收程序期望流处于特定形式,则发送程序必须生成预期格式。

如果您正在编写双方,那么您可以选择对您的情况有意义的序列化格式,例如JSON或XML,其中任何一个都可以表示Perl哈希。但是,如果不了解有关您具体情况的更多详细信息,那么就可以通过答案的方式提供所有这些内容。

答案 1 :(得分:1)

我更喜欢使用Storable模块。例如:

接收侧:

use strict;
use IO::Socket::INET;
use Storable;
use Data::Dumper;

my   $sock = IO::Socket::INET->new(Listen    => 5, LocalAddr => 'host',
                                 LocalPort => 9000,  Proto     => 'tcp');
while( my $s = $sock->accept ) {
    my $struct = Storable::fd_retrieve($s);
    print Dumper($struct);
}

发送侧:

use strict;
use IO::Socket::INET;
use Storable;

my   $sock = IO::Socket::INET->new(PeerAddr => 'host',  PeerPort => 9000,
                 Type     => SOCK_STREAM, Proto     => 'tcp') || die "Fail: $!";
my $struct = {
    a => 1,
    b => [2,3,4]
};
Storable::nstore_fd($struct, $sock);

通过从i386 Linux发送到amd64 FreeBSD进行测试。

你也可以使用Data :: Dumper从哈希中创建字符串,然后通过网络发送它的脏和错误的方法。

<强> UPD:

  

但是,我正在努力如何将perl端的哈希值转换为由空格分隔的字符串。

尝试使用加入/地图组合:

my $serialized = join("\n", map { "$_ ".$struct->{$_} } keys %$struct)."\n";

可能在C端更容易使用以null结尾的字符串:

my $keyvalue_count = scalar keys(%$struct);
my $serialized = join("\0", map { "$_\0".$struct->{$_} } keys %$struct)."\0";

在这个简单的例子中,我更喜欢使用最后一个变体,因为它原生于C。