2016-09-07 38 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