人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlでsocket関数で、任意のサーバーの稼動/不稼動をチェックするプログラムを書いています(以前ここで教えていただいた方法)。稼動しているサーバーはすぐにOKが返ってきますが、稼動していないサーバーはsocketのタイムアウトに20秒くらい時間がかかります。このタイムアウト時間を3秒ほどに縮めたいのですが方法を教えてください。

●質問者: dayofgreen
●カテゴリ:ウェブ制作
✍キーワード:Perl サーバー タイムアウト プログラム 関数
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● nyori3
●20ポイント

socket生成の後、システムコールでsokcetのタイムアウト時間を変更できます。

setsockoptで、SO_RCVTIMEOの値を3秒になるように調整してみてはいかがでしょうか?

◎質問者からの返答

ありがとうございます。setsockoptで与えるソケットのオプションの一覧や解説はありませんでしょうか。


2 ● tahishi
●20ポイント

http://www.google.co.jp/search?q=cache:eQZwBIerB5EJ:www.dream-se...

こんなのありました。これでtimeout短くできるとおもいます。

◎質問者からの返答

ありがとうございます。参考になりま。しかし、ソースも見ましたが、タイムアウトの設定はされていないようですね。


3 ● aki73ix
●20ポイント

http://nifberry.727.net/test/shoutcast2.htm

Socket関数のconnectのタイムアウトはレンタルサーバ側の設定なので、直接いじれなかったかと思います

これは、予測なのですが、複数のShouCastサーバをScanしたいということであれば、iframeタグで、CGIを呼び出してみてはいかがでしょうか?

-----------------------------

#!/usr/local/bin/perl

$mthd=$ENV{’REQUEST_METHOD’};

local($qu,@in,$key,$val);

if($mthd eq ’GET’){

$qu=$ENV{’QUERY_STRING’};

}

elsif($mthd eq ’POST’){

read(STDIN,$qu,$ENV{’CONTENT_LENGTH’});

}

*query = decode();

$host=$query{”host”};

$port=$query{”port”};

$addr = (gethostbyname($host))[4];

$file = ’/’;

$name = pack(”S n a4 x8”, 2,$port, $addr);

socket(S, 2, 1, 0);

$afx=connect(S, $name);

close(S);

print qq(Content-type: text/html¥n¥n);

print ”<html><body>¥n”;

print $host.”[”.$port.”]”;

if($afx == 1){

print ”OK”;

}

else{

print ”error”;

}

print ”</body><html>¥n”;

exit;

sub decode

{

local(@query)=split(/&/,$qu);

foreach(@query){

tr/+/ /;

($key,$val)=split(/=/);

$key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack(”c”,hex($1))/ge;

$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack(”c”,hex($1))/ge;

$val=~s/¥r¥n/¥n/g;

$vin{$key}=$val;

}

return *vin;

}

◎質問者からの返答

ありがとうございます。サンプルまで書いていただき感謝です。レンタルサーバーに限界があったので、今、自分のサーバーで試しています。まさにiframeで入れようという魂胆です。setsockoptのオプションの一覧があればお願いします。


4 ● aki73ix
●20ポイント

http://hegel.ittc.ukans.edu/topics/linux/man-pages/man2/setsocko...

>setsockoptのオプションの一覧があればお願いします。

だからTIMEOUT無理なんですけどね^^;

一応下のがそうです・2個目は日本語のLinuxリファレンスより

SO_DEBUG

enables recording of debugging information

SO_REUSEADDR

enables local address reuse

SO_KEEPALIVE

enables keep connections alive

SO_DONTROUTE

enables routing bypass for outgoing messages

SO_LINGER

linger on close if data present

SO_BROADCAST

enables permission to transmit broadcast messages

SO_OOBINLINE

enables reception of out-of-band data in band

SO_SNDBUF

set buffer size for output

SO_RCVBUF

set buffer size for input

SO_SNDLOWAT

set minimum count for output

SO_RCVLOWAT

set minimum count for input

SO_SNDTIMEO

set timeout value for output

SO_RCVTIMEO

set timeout value for input

SO_TYPE

get the type of the socket (get only)

SO_ERROR

get and clear error on the socket (get only)

http://www.linux.or.jp/JM/html/LDP_man-pages/man7/socket.7.html

Manpage of SOCKET

◎質問者からの返答

ありがとうございます。SO_SNDTIMEO, SO_RCVTIMEOはこれに該当しないのでしょうか。ちなみに今は自分のサーバーなので、OSの設定もいじれます(Windows XPですが)

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ