2016-09-07 30 views
1

我正试图学习如何使用套接字在同一台机器上的进程之间进行通信。我开始用Perl的食谱采取这种简单的测试程序:如何创建一个Unix域套接字?

use feature qw(say); 
use strict; 
use warnings; 
use IO::Socket; 

my $socket_file = 'mysocket'; 
if (-e $socket_file) { 
    unlink $socket_file or die "Could not delete socket file '$socket_file': $!"; 
} 
my $sock = IO::Socket::UNIX->new(
    LocalAddr => $socket_file, 
    Type  => SOCK_STREAM, 
    Listen => 5, # listen to max 5 connections 
) or die "Could not create socket: '[email protected]'"; 

say "Created socket successfully.."; 
sleep 1; 
close $sock; 
say "Closed socket.."; 

exit; 

输出是:

Could not create socket: '' at ./test.pl line 10. 

所以现在的问题是:为什么IO::Socket::UNIX->new()失败,为什么它没有设置[email protected]当它失败?

+0

似乎工作,如果我将'LocalAddr'改为'Local' .. –

回答

2

它没有设置[email protected],因为IO::Socket::UNIX没有在任何地方使用eval。 如果你打印出$!,而不是[email protected],你可能会看到:

Invalid argument at xxx.pl line 10. 

此时您可咨询IO::Socket::UNIX docs,看到通过正确的参数是Local,而不是LocalAddr

+1

Perl Cookbook日期到1998年,我不知道'IO :: Socket :: UNIX'是如何工作的。 – mob

+0

是的,好像书中的信息不是很准确。有没有更新的资源?如果我添加一个将写入同一套接字的客户端(一个新程序),那么我应该使用'Peer'和'Timeout'来代替服务器使用的'Listen'和'Local'? –

+0

我除了['IO :: Socket'](http://metacpan.org/pod/IO::Socket)和['perlipc'](http://metacpan.org/pod/ perlipc)。这些也已经存在了很长一段时间,但他们偶尔会用最新的例子进行更新。 – mob