我试图在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.