2011-10-09 5 views
7

私はXML-LibXSLTモジュールのメンテナーであり、テストの1つは存在しないURLにアクセスする必要があります。問題は、自分のシステムにURLが存在すると報告していたので、ウェブサービスがないと確信しているlocalhostにランダムなポートを割り当てることにしました。 Linux上で(予約ポートの値に)Perl:TCPポートを移植可能にする方法(利用できないURLがあるので)

# We reserve a random port to make sure the localhost address is not 
# valid. See: 
# 
# https://rt.cpan.org/Ticket/Display.html?id=52422 

my $sock = IO::Socket::INET->new(
    Proto => 'tcp', 
); 

my $port = $sock->sockport(); 

$file = "http://localhost:${port}/allow.xml"; 

さて、問題は、$ポートが定義されていることで、有効な、それはWindows上で動作するようには表示されません - このバグを参照してください。これは、そのように行われていましたレポート - https://rt.cpan.org/Ticket/Display.html?id=71456。私の質問は、どのようにPerl 5のUNIX、Mac OS X、Windows上で移植可能な新しいポートを無期限に予約することができますか?

よろしく、

Shlomi魚

答えて

5

ポート0を使用してループバックアドレスにbindを割り当てることができます(ポートが割り当てられるように)。ボーナスポイントの場合はconnectソケットを試してみてください(おそらくどこでも必要ありませんが、アドレスがあることを保証する必要があります)

+0

+1。 connect()は不要です。 – EJP

+0

@EJP:実際には、少なくともINADDR_ANYバインドされたソケットでは、Windowsがポート割り当てにいくらか怠け者のアプローチをとっていることをかすかに覚えています。 – Hasturkun

+0

ポートはbind()時間に割り当てられます。 – EJP

0

私は疑う(しかし、ここから証明できない)ソケットなどの時間が実際に聞いて開始されるまでのWindowsにポート番号が実際に割り当てられていないこと。

しかし、そのソケットを実際にリッスンすると、最初のTCP接続が実際に成功したため、テストが失敗するのを防ぐことができます。

代わりにURLがtest.example.comであることを指摘したと思われましたか?存在しないことが保証されていますか?

+0

[http://example.com](http://example.com) - 登録することはできませんが存在します。 –

+0

外部ネットワークが利用できない可能性があり、ユーザーの同意なしにどこかでテストを「電話」したくないため、ここではInternetworkedリソースにアクセスしたくないと思います。 –

+0

@ e.danだから私はサブドメインを提案したのです – Alnitak

4

bindアドレス+ポートへのソケットにします。これは、LocalAddr(またはLocalHost)と指定すると発生します。ポートを指定しない場合(またはポート0を指定した場合)、空いているポートが選択されます。

use strict; 
use warnings; 
use 5.010; 

use IO::Socket::INET qw(INADDR_ANY); 

my $sock = IO::Socket::INET->new(
    Proto  => 'tcp', 
    LocalAddr => INADDR_ANY, 
); 

my $port = $sock->sockport(); 

say $port; # 60110 

ループバックアダプタからの接続のみを受け入れると思うと思います。その場合はINADDR_ANYの代わりにINADDR_LOOPBACKを使用してください。

関連する問題