2012-12-04 41 views
3

我想在Perl中创建套接字客户端。服务器端是在本地主机上运行的C程序。Perl套接字发送散列

我必须通过套接字发送散列。这是我正在使用的一段代码。现在

,我已经是问题,$globalConfig将包含一个散列引用,我想通过套接字发送此。我无法弄清楚。我搜索了一下,发现了一些Dumper的参考资料,但不明白。我如何发送散列?

回答

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面的更容易使用空终止字符串:

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

在这个简单的例子我宁愿使用最后一个变体,因为它的原生C. C.

+1

接收器是用C语言编写的但也许它只是存储数据供Perl以后检索? – ikegami

+0

@ikegami Opps我没有留意到这一点。在这种情况下,它真的更复杂,因为在纯C中散列实现并不容易。可能它坚持**可存储:: fd_retrieve **使用perlembed。或者像ikegami所说的那样,发送文本就像'key = value \ n' – PSIAlt

+0

,服务器是一个c程序。它将它们作为包含argc和argv的结构体接收。我想的一种方法是将哈希值转换为空格分隔的字符串。在发送之前。但是,我正在努力如何将perl端的散列值转换为由空格分隔的字符串。欣赏任何帮助 –

6

要通过套接字发送数据结构,您必须将其“序列化”为字节流。然后接收程序必须反序列化它以重新组装数据结构。如果接收程序希望该流处于特定形式,则发送程序必须产生预期的格式。

如果您正在编写双方,那么您可以选择一种对您的情况有意义的序列化格式,例如JSON或XML,其中任何一种都可以表示Perl哈希。然而,在不了解你的具体情况的更多细节的情况下,这是关于所有可以通过答案的方式提供的。