我想在Perl中创建套接字客户端。服务器端是在本地主机上运行的C程序。Perl套接字发送散列
我必须通过套接字发送散列。这是我正在使用的一段代码。现在
,我已经是问题,$globalConfig
将包含一个散列引用,我想通过套接字发送此。我无法弄清楚。我搜索了一下,发现了一些Dumper的参考资料,但不明白。我如何发送散列?
我想在Perl中创建套接字客户端。服务器端是在本地主机上运行的C程序。Perl套接字发送散列
我必须通过套接字发送散列。这是我正在使用的一段代码。现在
,我已经是问题,$globalConfig
将包含一个散列引用,我想通过套接字发送此。我无法弄清楚。我搜索了一下,发现了一些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:
但是,我奋力如何将这些值转换中的散列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.
要通过套接字发送数据结构,您必须将其“序列化”为字节流。然后接收程序必须反序列化它以重新组装数据结构。如果接收程序希望该流处于特定形式,则发送程序必须产生预期的格式。
如果您正在编写双方,那么您可以选择一种对您的情况有意义的序列化格式,例如JSON或XML,其中任何一种都可以表示Perl哈希。然而,在不了解你的具体情况的更多细节的情况下,这是关于所有可以通过答案的方式提供的。
接收器是用C语言编写的但也许它只是存储数据供Perl以后检索? – ikegami
@ikegami Opps我没有留意到这一点。在这种情况下,它真的更复杂,因为在纯C中散列实现并不容易。可能它坚持**可存储:: fd_retrieve **使用perlembed。或者像ikegami所说的那样,发送文本就像'key = value \ n' – PSIAlt
,服务器是一个c程序。它将它们作为包含argc和argv的结构体接收。我想的一种方法是将哈希值转换为空格分隔的字符串。在发送之前。但是,我正在努力如何将perl端的散列值转换为由空格分隔的字符串。欣赏任何帮助 –