Perl套接字发送哈希

前端之家收集整理的这篇文章主要介绍了Perl套接字发送哈希前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在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的引用,但不太了解.如何发送哈希?

解决方法

我更喜欢使用 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:

But,I am struggling how to convert the values in the hash on perl side to a string separated by space.

尝试使用join / map组合:

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.

猜你在找的Perl相关文章